2012-06-27 138 views
1

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

我有一列是查询另一个表中的列的名称。

也就是说,我已经cities.country_id作为一列,在视图模板我做的:

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

显示的名称。

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

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

我能想到的唯一的事情就是在控制器中执行一条IF语句,并按国家排序,然后使用联接运行另一个查询,但这很丑陋,容易出错,希望得到某些东西更优雅。

谢谢。

回答

0

最后,我决定使用一个连接去开始用正确的数据。尽管Webjedi的回答非常有趣,但我不想重写任何内置函数,但很高兴知道我能做到这一点。

的代码看起来是这样的:

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

你可以覆盖国家模型上的to_s来返回名称,然后按控制器中的排序吗?

在贵国模型覆盖to_s由:

def to_s 
country.name 
end 

然后在你的控制器

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

对不起,我不明白你的意思 – kakubei

+0

我会更新的答案。 – Webjedi

+0

这真的很有趣。我从来没有见过它。最后,我加入了一个联盟,所以我也可以查询国家名称,但非常感谢您指出了这一点。我必须试一试。 – kakubei

0

除了Webjedi答案..

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

不要这样做。你应该使用数据库。 – maletor

相关问题