Подтвердить что ты не робот

Заказ Rails в связанной модели

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

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

Ответ 1

Существует несколько способов сделать это:

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

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

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

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

Ответ 2

Синтаксис

rails 4.2.20 требует вызова с помощью блока:

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

Это также можно записать с помощью альтернативного синтаксиса:

default_scope { order(some_col: :desc) }

Ответ 3

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

Item.all(:conditions => {:log_id => some_log.id}, :order => "some_col DESC")
some_log.items.all(:order => "some_col DESC")

Ответ 4

установите default_scope в классе модели

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

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