Думающий сфинкс без условий - PullRequest
0 голосов
/ 11 марта 2012

У меня есть следующая модель:

class Article < ActiveRecord::Base

  define_index do
    indexes content
    indexes :name, sortable: true
    has type
  end
end

и специальный тип статьи:

class About < Article
end

и то же самое для Contact

Я быхотел бы иметь доступное для поиска действие индекса статей без статей с типом "About" или "Contact"

class ArticlesController < ApplicationController
  load_and_authorize_resource

  def index
    @articles = Article.search(params[:search],
                               :with_all => {:type => nil},
                               :page => params[:page],
                               :per_page => 10)
  end
end

Но переменная экземпляра @articles каждый раз содержит также статьи "About" и "Contact".

Это очень странно (кажется, что will_paginate все испортил):

@articles = Article.search(
  :without =>  {:type => %w(About Contact)}).include?(About.first) # false

@articles = Article.search(
  :without =>  {:type => %w(About Contact)},
  :page => 1,
  :per_page => 1000).include?(About.first) # true

===================================================================================

Наконец-то я сделал:

class Article < ActiveRecord::Base

  define_index do
    indexes content
    indexes :name, sortable: true

    has "CRC32(type)", :as => :article_type, :type => :integer
  end
end

и:

class ArticlesController < ApplicationController

  load_and_authorize_resource

  def index
     @articles = Article.search(params[:search],
                               :without =>  {:article_type => ["About".to_crc32, "Contact".to_crc32]},
                               :page => params[:page],
                               :per_page => 10)
  end
end

и все работает.Спасибо, ребята!

Ответы [ 3 ]

2 голосов
/ 11 марта 2012

Из Thinking Sphinx FAQ :

Фильтрация по строковым атрибутам

Хотя вы можете иметь строковые столбцы в качестве атрибутов в Sphinxони не хранятся в виде строк.Вместо этого Sphinx вычисляет алфавитный порядок и дает каждой строке целочисленное значение, чтобы сделать их полезными для сортировки.Однако это означает, что фильтровать эти атрибуты практически невозможно.

Таким образом, чтобы обойти это, есть два варианта: во-первых, используйте целочисленные атрибуты, если возможно.Это работает для небольших наборов результатов (например: пол).В противном случае вам может потребоваться вручную преобразовать строку в целочисленное значение CRC:

has "CRC32(category)", :as => :category, :type => :integer

Таким образом, вы можете отфильтровать его следующим образом:

Article.search 'pancakes', :with => { :category => 'Ruby'.to_crc32 }

Конечно, это не удивительно чисто, но будет работать довольно хорошо.Также следует учесть, что кодирование CRC32 может иметь коллизии, поэтому это не идеальное решение.

1 голос
/ 11 марта 2012

Исключить информацию о типе и контакте из таких условий, как -

@articles = Article.search(params[:search],
             :without => {:type => %w(About Contact)},
             :page => params[:page],
             :per_page => 10)

OR

Я не очень уверен ниже, но вы можете попробовать ...

  define_index do
    indexes content
    indexes :name, sortable: true
    indexes(:type), :as => :article_type
  end

    @articles = Article.search(params[:search],
                 :without => {:article_type => %w(About Contact)},
                 :page => params[:page],
                 :per_page => 10)

Кроме того, убедитесь, что внутри записей вашей базы данных правильно установлен атрибут type ..

0 голосов
/ 11 марта 2012

Не могли бы вы использовать «с» вместо «с_все»? Например:

@articles = Article.search(params[:search],
                               :with => {:type => nil},
                               :page => params[:page],
                               :per_page => 10)
...