[英]Rails: Using will_paginate with a complex association find
我在进行复杂的查找时遇到了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一起使用的搜索? 如果这是唯一的方法,我想我应该看看另一个分页插件吗?
谢谢!
仅供参考,这是我终于找到的解决方法:
@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
您必须使用页码作为偏移量并使用标签进行联接查询来手动构造分页集。 有点笨拙。
我的第一个选项(对不起,现在没有时间进行测试...如果我这样做,将会更新)将类似于以下内容(添加了: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}"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.