Using Ferret and the acts_as_ferret plugin, I would like to retrieve results based on models descended from a parent model: class Post < ActiveRecord::Base acts_as_ferret :fields => [ ''title'', ''body'', :post_author, :post_comments ] ... has_one :author has_many :comments end I would like to search all comments of a post and retrieve Post models as search results. Currently, searching across :author fields is achieved using: def post_author self.author.name end However, a similiar technique does not seem to work for the has_many relationship: def post_comments for comment in self.comments @comments << comment.body @comments << comment.name end @comments.join(" ") end Searching across author fields finds the correct Post. However, none of the comments seems to be indexed and/or associated with the correct Post so no search results are found. I would appreciate any help on this. Thanks! Rami -------- Note: The post model is saved after comment changes are made in order for acts_as_ferret to index the Post. Also note that multi_search would not easily apply here since I know for certain I would like to retrieve the Post model, and not the Comment or Author model as search results. -- Posted via http://www.ruby-forum.com/.
Jens Kraemer
2006-Jul-21 09:22 UTC
[Ferret-talk] acts_as_ferret with has_many relationship
Hi Rami, could you have a look at your development.log and check what values actuelly gets indexed for the post_comments field when you save the post ? Jens On Fri, Jul 21, 2006 at 08:51:48AM +0200, Rami Bitar wrote:> Using Ferret and the acts_as_ferret plugin, I would like to retrieve > results based on models descended from a parent model: > > class Post < ActiveRecord::Base > > acts_as_ferret :fields => [ ''title'', > ''body'', > :post_author, > :post_comments > ] > ... > > has_one :author > has_many :comments > end > > I would like to search all comments of a post and retrieve Post models > as search results. Currently, searching across :author fields is > achieved using: > > def post_author > self.author.name > end > > However, a similiar technique does not seem to work for the has_many > relationship: > > def post_comments > for comment in self.comments > @comments << comment.body > @comments << comment.name > end > @comments.join(" ") > end > > Searching across author fields finds the correct Post. However, none of > the comments seems to be indexed and/or associated with the correct Post > so no search results are found. I would appreciate any help on this. > > Thanks! > > Rami > > -------- > Note: The post model is saved after comment changes are made in order > for acts_as_ferret to index the Post. Also note that multi_search would > not easily apply here since I know for certain I would like to retrieve > the Post model, and not the Comment or Author model as search results. > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Ferret-talk mailing list > Ferret-talk at rubyforge.org > http://rubyforge.org/mailman/listinfo/ferret-talk-- webit! Gesellschaft f?r neue Medien mbH www.webit.de Dipl.-Wirtschaftsingenieur Jens Kr?mer kraemer at webit.de Schnorrstra?e 76 Tel +49 351 46766 0 D-01069 Dresden Fax +49 351 46766 66
You might want to try removing the @ symbol from comments and name it something else to avoid conflict with your relationship. def post_comments self.comments.inject([]) { |ary, c| ary << c.body << c.name }.join('' '') end -Lee On 7/21/06, Rami Bitar <rbitar at gmail.com> wrote:> Using Ferret and the acts_as_ferret plugin, I would like to retrieve > results based on models descended from a parent model: > > class Post < ActiveRecord::Base > > acts_as_ferret :fields => [ ''title'', > ''body'', > :post_author, > :post_comments > ] > ... > > has_one :author > has_many :comments > end > > I would like to search all comments of a post and retrieve Post models > as search results. Currently, searching across :author fields is > achieved using: > > def post_author > self.author.name > end > > However, a similiar technique does not seem to work for the has_many > relationship: > > def post_comments > for comment in self.comments > @comments << comment.body > @comments << comment.name > end > @comments.join(" ") > end > > Searching across author fields finds the correct Post. However, none of > the comments seems to be indexed and/or associated with the correct Post > so no search results are found. I would appreciate any help on this. > > Thanks! > > Rami > > -------- > Note: The post model is saved after comment changes are made in order > for acts_as_ferret to index the Post. Also note that multi_search would > not easily apply here since I know for certain I would like to retrieve > the Post model, and not the Comment or Author model as search results. > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Ferret-talk mailing list > Ferret-talk at rubyforge.org > http://rubyforge.org/mailman/listinfo/ferret-talk >
Hi Jens, After looking at the development log, I''ve solved the problem. It turns out that acts_as_ferret was not indexing ''comments'' since another table I was also trying to index was ''null.'' As a result, acts_as_ferret was terminating prematurely (due to the null error) before it could even index the ''comment'' values. The code I originally posted, therefore, should work fine for others. Thanks for your help and all your great work! Rami @Lee: Yes, thanks for the suggestion. I will remove the @ symbol to eliminate any possible conflicts. Jens Kraemer wrote:> Hi Rami, > > could you have a look at your development.log and check what values > actuelly gets indexed for the post_comments field when you save the > post ? > > Jens > > On Fri, Jul 21, 2006 at 08:51:48AM +0200, Rami Bitar wrote: >> ... >> self.author.name >> @comments.join(" ") >> -------- >> http://rubyforge.org/mailman/listinfo/ferret-talk > -- > webit! Gesellschaft f?r neue Medien mbH www.webit.de > Dipl.-Wirtschaftsingenieur Jens Kr?mer kraemer at webit.de > Schnorrstra?e 76 Tel +49 351 46766 0 > D-01069 Dresden Fax +49 351 46766 66-- Posted via http://www.ruby-forum.com/.