5

我在进行复杂查找时遇到了 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}"

我想获取所有在 tag_ids 数组中具有所有标签的照片。MySQL 的 IN 通常进行“或”搜索,但我需要“和”。我在这里找到了如何修改 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`(...)

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

有没有更好的方法可以与 will_paginate 一起使用?如果这是唯一的方法,我想我应该看看另一个分页插件?

谢谢!

4

2 回答 2

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

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

于 2010-06-02T23:24:03.000 回答
1

我的第一次尝试(对不起,现在没有时间测试它......如果我这样做会更新)将类似于以下内容(添加:select并更改:group):

@photos = @item.photos.paginate :page => params[:page],
                                :per_page => 200,
                                :select => "photos.*, COUNT(DISTINCT tags.id) AS tag_count",
                                :conditions => [ 'tags.id IN (?)', tag_ids ],
                                :order => 'created_at DESC',
                                :joins => :tags,
                                :group => "photos.id HAVING tag_count = #{tag_count}"
于 2010-07-03T17:28:26.347 回答