Rails сортировка дочерних объектов и отображение - PullRequest
0 голосов
/ 24 сентября 2010

Относительно моего последнего вопроса здесь: Rails: Поиск всех связанных объектов с родительским объектом

Можно ли отсортировать несколько отдельных дочерних объектов в Rails по дате создания, а затем перечислитьих?Используя предыдущий пример, у меня есть резюме с двумя различными дочерними объектами has_many, я хотел бы получить их, а затем отсортировать их по дате создания и затем использовать их для их отображения.

Ответы [ 3 ]

3 голосов
/ 24 сентября 2010

Я предполагаю, что у вас есть две (или более) отдельные модели для дочерних объектов, поэтому ваша модель Parent выглядит следующим образом:

class Parent < ActiveRecord::Base
  has_many :dogs
  has_many :cats
end

Чтобы отсортировать их и получить их, как правило, как children, вы можете написать метод (аналогично @gertas answer):

def children
  @children ||= (self.dogs.all + self.cats.all).sort(&:created_at)
end

и поместите его в Parent модель. Тогда вы можете использовать его в контроллере:

@parent = Parent.find(params[:id])
@children = @parent.children

Теперь мы попробуем отобразить их в виде. Я предполагаю, что вы создали два партиала для каждой модели _cat.html.erb и _dog.html.erb. В поле зрения:

<h1>Children list:</h1>
<% @parent.children.each do |child| %>
  <%= render child %>
<% end %>

Он должен автоматически находить, какую часть следует использовать, но он может быть использован только в том случае, если вы следуете пути Rails. Если вы хотите по-разному называть частичные имена или хранить их в другом каталоге, вам придется написать свои собственные методы, которые будут выбирать правильный частичный тип в зависимости от типа объекта od.

1 голос
/ 24 сентября 2010

Поскольку дочерние объекты относятся к разным типам и выбираются отдельно (отдельно has_many), вы должны выполнить сортировку в Ruby:

sorted_childs=(@resume.child1_sections.all + @resume.child2_sections.all).sort(&:created_at)

В противном случае вам нужно будет ввести наследование таблиц с общими столбцами в parent. Тогда было бы возможно иметь еще has_many для всех детей с :order.

1 голос
/ 24 сентября 2010

Вы можете добавить метод доступа к вашей родительской модели:

class Parent < ActiveRecord::Base
  def sorted_children
    children.scoped( :order => 'created_at DESC' )
    # or, in rails3:
    # children.order('created_at DESC')
  end
end

Если естественным порядком для вашей дочерней модели является поле даты, и вы хотите делать это везде, то просто установите для него область действия по умолчанию:

class Child < ActiveRecord::Base
  default_scope :order => 'created_at DESC'
end
...