Рельсы упорядочены в связанной модели - PullRequest
40 голосов
/ 14 июля 2009

У меня есть две модели в отношении has_many, такие как Log has_many Items. Затем Rails прекрасно настраивает такие вещи, как: some_log.items, который возвращает все связанные элементы в some_log. Если бы я хотел упорядочить эти элементы на основе другого поля в модели элементов, есть ли способ сделать это с помощью аналогичной конструкции, или нужно разбить что-то вроде:

Item.find_by_log_id(:all,some_log.id => "some_col DESC")

Ответы [ 4 ]

74 голосов
/ 14 июля 2009

Есть несколько способов сделать это:

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

class Log < ActiveRecord::Base
  has_many :items, :order => "some_col DESC"
end

Вы также можете сделать это с named_scope, что позволит легко указывать этот порядок в любое время при обращении к элементу:

class Item < ActiveRecord::Base
  named_scope :ordered, :order => "some_col DESC"
end

class Log < ActiveRecord::Base
  has_many :items
end

log.items # uses the default ordering
log.items.ordered # uses the "some_col DESC" ordering

Если вы всегда хотите, чтобы элементы упорядочивались одинаково по умолчанию, вы можете использовать метод default_scope (новый в Rails 2.3) следующим образом:

class Item < ActiveRecord::Base
  default_scope :order => "some_col DESC"
end
16 голосов
/ 01 января 2015

rails 4.2.20 синтаксис требует вызова с блоком:

class Item < ActiveRecord::Base
  default_scope { order('some_col DESC') }
end

Это также может быть записано с альтернативным синтаксисом:

default_scope { order(some_col: :desc) }
4 голосов
/ 14 июля 2009

Любой из них должен работать:

Item.all(:conditions => {:log_id => some_log.id}, :order => "some_col DESC")
some_log.items.all(:order => "some_col DESC")
3 голосов
/ 06 августа 2011

набор default_scope в классе вашей модели

class Item < ActiveRecord::Base
  default_scope :order => "some_col DESC"
end

Это будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...