Rails按另一个表中的列名对列进行排序

时间:2012-06-27 17:33:22

标签: ruby-on-rails

我正在使用handles_sortable_columns对Rails 3中的列进行排序,并且想知道是否有一种方法可以按照除使用连接之外的其他表中的列进行排序。

我有一个列,它是查找另一个表中列的名称。

也就是说,我将cities.country_id作为列,并在View模板中执行:

@cities.each do |city|
    city.country.name

显示名称。

我希望能够按此列排序,但countries.name而不是cities.country_id

有没有人知道这可能与宝石或任何其他简单的方式?如果是这样的话?

我唯一能想到的是在控制器中执行IF语句并按国家/地区捕获排序,然后使用连接运行不同的查询,但这很丑陋且容易出错,希望有更多的东西优雅。

感谢。

3 个答案:

答案 0 :(得分:1)

您是否可以覆盖国家/地区型号上的to_s以返回名称,然后按控制器中的名称排序?

在您的国家/地区模型中覆盖to_s:

def to_s
 country.name
end

然后在您的控制器中

@sorted_cities = @cities.sort_by { |obj| obj.country.to_s }

答案 1 :(得分:0)

最后,我决定使用联接来获取正确的数据。虽然Webjedi的答案非常有趣,但我不想覆盖任何内置函数,但我很高兴知道我可以做到这一点。

代码如下所示:

@countries = Country.select('countries.*, continents.name AS continent_name').joins{continent}.search(params[:term]).order(order).page(params[:page])

答案 2 :(得分:0)

除了Webjedi回答..

 @sorted_cities = @cities.includes(:country).sort_by { |obj| obj.country.to_s } #for eager loading