2010-04-13 4 views
0

je n'ai pas travailler 2 modèles A et B.find_with_ferret, modèle multiple

class A < ActiveRecord::Base 
    has_one :b 

acts_as_ferret :fields => [:title,:description] 

En a_cotroller, je l'ai écrit:

@search=A.find_with_ferret(params[:st][:text_search],:limit => :all).paginate :per_page =>10, :page=>params[:page] 

La recherche de titre et la description ci-dessus fonctionne correctement.

classe B < ActiveRecord :: Base belongs_to: un

Maintenant, je veux effectuer une recherche de texte à l'aide de 3 champs; titre, description (partie de A) et commentaire (partie de B). Où je veux inclure le champ de commentaire pour effectuer la recherche de furet. Ensuite, quels autres changements nécessaires.

Répondre

0

La documentation de find_with_ferret indique que vous codez simplement :store_class_name => :true pour activer la recherche sur plusieurs modèles. Bien que ce soit vrai, il y en a un peu plus. Pour effectuer une recherche multiple, procédez comme suit:

@search = A.find_with_ferret(
    params[:st][:text_search], 
    :limit => :all, 
    :multi => [B] 
).paginate :per_page =>10, :page=>params[:page] 

Notez l'option multi. Ceci est un tableau des index supplémentaires à rechercher. Pour obtenir son travail, vous devez reconstruire vos index après avoir ajouté :store_class_name => :true aux définitions d'index.

class A < ActiveRecord::Base 
    has_one :b 

    acts_as_ferret :store_class_name => :true, :fields => [:title, :description] 
end 

OU ...

Vous pouvez inclure simplement les champs B de la définition de l'index:

class A < ActiveRecord::Base 
    has_one :b 

    acts_as_ferret :fields => [:title, :description], 
       :additional_fields => [:b_content, :b_title] 

    def b_content 
    b.content 
    end 

    def b_title 
    b.title 
    end 
end 

Cela rend tout simple, mais ne permet pas de rechercher le modèle B indépendamment A.

+0

classe A [: titre, description:], : additional_fields => [: b_content,: b_title] def b_content b.content fin def b_title b.title fin fin Il travaille maintenant ... merci. – jissy