Я встречаюсь с проблемой с 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 В обычно делает "или" ищет, но мне нужно "и". Я нашел, как изменить В подражать "и" поведение здесь, и оно хорошо работает при использовании 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`(...)
который не работает. Другой видели эту ошибку и смогли переместить их количество () из запроса, но я не думаю, что это возможно в моем случае.
Существует ли лучший способ сделать этот поиск, который мог бы работать с 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}"