0

簡単な検索を実行したい3つのモデルがあります。

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

製品のみを戻したい場合は、両方の結合を追加するだけです。

@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つの別々のクエリを試してください。

于 2012-06-07T13:16:07.227 に答える
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

また、オブジェクトごとにコードを適切に動作させることができます。


私が助けてくれたことを願っています。

于 2012-06-07T13:08:28.690 に答える