Rails 3.1 - 跨三个(或更多)模型进行简单搜索?

时间:2012-06-07 11:46:45

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有三种模式可以执行简单搜索:

class Release < ActiveRecord::Base
  has_many :artist_releases
  has_many :artists, :through => :artist_releases  
  has_many :products, :dependent => :destroy     
end

class Product < ActiveRecord::Base
  belongs_to :release
  has_many :artists, :through => :releases        
end

class Artist < ActiveRecord::Base
  has_many :artist_releases
  has_many :releases, :through => :artist_releases
end

在我的产品控制器中,我可以使用以下方式成功呈现跨版本和产品的产品列表搜索:

@products = Product.find(:all, :joins => :release, :conditions => ['products.cat_no LIKE ? OR releases.title LIKE ?', "%#{params[:search]}%","%#{params[:search]}%"])

我真的需要能够搜索艺术家。我该怎么做呢?理想情况下,我需要在产品控制器中使用它,因为它是我需要显示的产品列表。

我尝试过添加:joins =&gt; :艺术家及其变体,但似乎都没有效果。

我知道像Sphinx这样的选项可以进行全面搜索,但是现在我只需要这种简单的方法就可以了。

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果您只想要产品,只需添加两个连接:

@products = Product.joins(:release,:artists).where('products.cat_no LIKE :term OR releases.title LIKE :term OR artists.name LIKE :term', :term => "%#{params[:search]}%").all

您可能还需要group_by来获取不同的产品。

如果您想要多态结果,请尝试3个单独的查询。

答案 1 :(得分:0)

我知道我建议采用一种简单的方法(可能效率不高),但它会让你的工作完成:

我会在您的Product模型中创建一个与此类似的方法:

def find_products_and_artists
  results = []
  Product.find(:all, :conditions => ['products.cat_no LIKE ?', "%#{params[:search]}%"]).each do |prod|
    results << prod
  end
  Release.find(:all, :conditions => ['releases.title LIKE ?', "%#{params[:search]}%"]).each do |rel|
    results << rel
  end
  Artist.find(:all, :conditions => ['artist.name LIKE ?', "%#{params[:search]}%"]).each do |art|
    results << art
  end
  return results
end

然后当你调用方法并将返回的结果存储在一个变量中(例如results)时,你可以通过检查每个元素的对象来检查

results[i].class

可以使您的代码对每个对象都有相应的行为。


希望我帮忙。