在我的Ruby on Rails应用程序中,我有一个模型,它与其他模型有许多一对一的关联。假设每个Instance
属于Region
,Country
和City
。我使用Instance
选择了几个scope
,现在我想根据name
,Region
和{{Country
属性对它们进行排序1}}不属于City
模型本身的模型。
问题是我希望Instance
,Instances
和Region
在ActiveAdmin页面的索引操作上显示所选的Country
,因此,我想要让它们按此顺序排序。
答案 0 :(得分:2)
通过属性在一个或多个关联上订购集合非常简单 - 通过其属性加入关联和排序。冗长的方式是这样的:
Instance.joins(:region, :country, :city).
order("regions.name DESC").
order("countries.name DESC").
order("cities.name DESC")
但我建议将这些条件作为范围写在您的模型上。然后,您可以更轻松地更改和重用它们。
class Instance < ActiveRecord::Base
scope :ordered, -> do
joins(:region, :country, :city).
merge(Region.ordered).
merge(Country.ordered).
merge(City.ordered)
end
end
class Region < ActiveRecord::Base
scope :ordered, -> do
order(name: :desc)
end
end
class Country < ActiveRecord::Base
scope :ordered, -> do
order(name: :desc)
end
end
class City < ActiveRecord::Base
scope :ordered, -> do
order(name: :desc)
end
end
这里的神奇之处在于merge
方法,记录为here。
像
一样把它放在一起@instances = Instance.ordered