Rails + Ransack:首先按association.name =' string'排序,然后按字母顺序排序其他所有内容

时间:2013-12-17 16:07:27

标签: ruby-on-rails ransack

我的书有很多book_versions(平装,精装,六包)。

在索引页面的初始加载时,它会加载此查询:

@search = Book.includes(:book_versions).search(params[:q])

当有人尝试排序时,我目前有这个查询:

@search = Book.includes(:book_versions).where( :book_versions => { :name => params[:book_version_name ] } ).search(params[:q])

问题在于,如果params[:book_version_name] = 'paperback'它只发回book_versions,其中包含book_versions.name ='paperback'。这意味着其他结果都没有显示出来。相反,我希望它:

  1. 首先显示book_versions,其名称为''paperback'
  2. 显示所有book_versions的名称!='paperback'
  3. 我将如何做到这一点?感谢。

1 个答案:

答案 0 :(得分:0)

好像你总是想要所有的书,所以坚持你的第一个查询,然后在ruby中进行分组?

@result = Book.includes(:book_versions).search(params[:q])
@book_version_name = params[:book_version_name]

# in memory filtering of the result
@primary = @result.select { |x| x.book_version.name == @book_version_name }
@secondary = @result.select { |x| x.book_version.name != @book_version_name }

请参阅ruby select(不是rails数据库方法)http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-select

# the above could probably be written this way as well
@primary = @result.select { |x| x.book_version.name == @book_version_name }
@secondary = @result - @primary