0

我想对三个模型进行简单的搜索:

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 => :artist 及其变体,但似乎没有一个工作。

我知道有像 Sphinx 这样的选项可以进行完整搜索,但现在我只需要这种简单的方法来工作。

提前致谢!

4

2 回答 2

1

if you only want products back, just add both joins:

@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

You may also need group_by to get distinct products back.

if you want polymorphic results, try 3 separate queries.

于 2012-06-07T13:16:07.227 回答
0

我知道我建议的是一种简单的方法(可能不是最有效的),但它会完成你的工作:

我会在您的产品模型中创建一个类似于以下的方法:

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

并且可以使您的代码针对每个对象做出相应的行为。


希望我有所帮助。

于 2012-06-07T13:08:28.690 回答