Rails:使用带复杂关联的will_paginate查找

Jor*_*aff 5 activerecord ruby-on-rails will-paginate

我在进行复杂的查找时遇到了will_paginate的问题.

:photo  has_many   :tags,   :through => :tagships
:item   has_many   :photos
:photo  belongs_to :item


@photos = @item.photos.paginate :page => params[:page],
                                :per_page => 200,
                                :conditions => [ 'tags.id IN (?)', tag_ids],
                                :order => 'created_at DESC',
                                :joins => :tags,
                                :group => "photos.id HAVING COUNT(DISTINCT tags.id) = #{tag_count}"
Run Code Online (Sandbox Code Playgroud)

我想获取tag_ids数组中包含所有标签的所有照片.MySQL的IN通常会进行"或"搜索,但我需要"和".我发现如何修改模仿"和"行为在这里,它使用model.find时(正常工作),只要也可以作为记录的数量获取比我低:per_page计数.但是如果它必须分页,生成的SQL类似于:

SELECT count(*) AS count_all, photos.id HAVING COUNT(DISTINCT tags.id) = 1 AS photos_id_having_count_distinct_tags_id_1 FROM `photos`(...)
Run Code Online (Sandbox Code Playgroud)

这不起作用.其他人已经看到了这个错误,并且能够将他们的count()从查询中移出,但我不认为在我的情况下这是可能的.

有没有更好的方法来执行可能与will_paginate一起使用的搜索?如果它是唯一的方法,我想我应该看看另一个分页插件?

谢谢!

Jor*_*aff 4

仅供参考,这是我最终找到解决此问题的方法:

@photos = WillPaginate::Collection.create(current_page, per_page) do |pager|
    result = @item.photos.find :all, :conditions => [ 'tags.id IN (?)', tag_ids] ,:order => 'created_at DESC', :joins => :tags, :group => "photos.id HAVING COUNT(DISTINCT tags.id) = #{@tags.count}", :limit => pager.per_page, :offset => pager.offset
    pager.replace(result)

    unless pager.total_entries
      pager.total_entries = @item.photos.find(:all, :conditions => [ 'tags.id IN (?)', tag_ids] ,:order => 'created_at DESC', :joins => :tags, :group => "photos.id HAVING COUNT(DISTINCT tags.id) = #{@tags.count}").count
    end
  end
Run Code Online (Sandbox Code Playgroud)

您必须使用页码作为偏移量并使用标签进行连接查询来手动构建分页集。有点笨重。