El formulario del modelo anidado de Rails muestra un orden aleatorio en los objetos secundarios

He seguido y usado Tutorial de formulario de modelo anidado de Ryan Bate para crear pistas para mis lanzamientos (en el tutorial son preguntas para encuestas).

Esto funciona muy bien hasta que noté que el orden en que se agregan las pistas a la base de datos es aparentemente aleatorio, no como aparecen o se ingresan en la forma en que necesito que sea así.

Las pistas se construyen utilizando la siguiente definición en el modelo de lanzamiento:

 def track_attributes=(track_attributes)
    track_attributes.each do |attributes|
      tracks.build(attributes)
    end
  end

Luego, en el release _form parcial tengo:

<%= f.fields_for :tracks do |builder| %>
<%= render 'track_fields', :f => builder %>
<% end %>

Eso atrae el parcial _track_fields, que contiene:

<%= f.text_field :name, :class => "text" %>
<%= f.text_field :isrc, :class => "text" %>
<%= f.check_box :_destroy %>
etc

¿Alguna idea de por qué la matriz de pistas está perdiendo el orden en que se ingresaron?

Estoy usando acts_as_list en releases_tracks, tiene muchos modelos que funcionan bien, pero toma el orden de lo que se agregó incorrectamente a la tabla de pistas.

EDIT:

Parece que mis pistas se están guardando con:

accepts_nested_attributes_for :tracks, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => :true

No a través de track_attributes=(track_attributes) def como había pensado.

¿Alguien sabe cómo escribir un método before_save que ordenará las pistas por un campo de posición que ahora he agregado al formulario?

preguntado el 02 de mayo de 12 a las 15:05

1 Respuestas

El orden en que se ejecutan las consultas SQL es aleatorio en general. Esto puede aplicarse tanto a una inserción masiva como a una selección. Si necesita sus registros en un orden determinado, debe utilizar una cláusula ORDER BY. Dependiendo de cómo se guarden los registros, es posible que pueda ordenar por ID; de lo contrario, considere agregar un campo que represente la posición de la lista de cada elemento.

contestado el 02 de mayo de 12 a las 15:05

Ah, pensé que este podría ser el caso. De hecho, estoy un poco confundido acerca de cómo se guardan las pistas ahora, ya que después de comentar la línea tracks.build (attributes) que pensé que las había guardado, ¡todavía puedo guardar pistas! - Raoot

build no guarda el objeto ActiveRecord; simplemente lo crea en la memoria. - Salil

Ah, ya veo. ¿Alguna idea de si puedo agregar una definición de 'sort_tracks' y una llamada before_save a mi modelo de lanzamiento para lograr esto? - Raoot

Hola Ryan, ¿has encontrado una manera de mantener el orden de tus pistas? Estoy enfrentando exactamente el mismo problema y no puedo encontrar una solución. ¡Ayudar! - Tintin81

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.