我有三种模式可以执行简单搜索:
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这样的选项可以进行全面搜索,但是现在我只需要这种简单的方法就可以了。
提前致谢!
答案 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
可以使您的代码对每个对象都有相应的行为。
希望我帮忙。