如何在Ruby on Rails中基于关联属性订购一组对象?

时间:2015-03-16 20:40:06

标签: ruby-on-rails ruby activeadmin

在我的Ruby on Rails应用程序中,我有一个模型,它与其他模型有许多一对一的关联。假设每个Instance属于RegionCountryCity。我使用Instance选择了几个scope,现在我想根据nameRegion和{{Country属性对它们进行排序1}}不属于City模型本身的模型。

问题是我希望InstanceInstancesRegion在ActiveAdmin页面的索引操作上显示所选的Country,因此,我想要让它们按此顺序排序。

1 个答案:

答案 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