2012-06-07 32 views
0

我有三個型號,我想執行跨一個簡單的搜索:Rails 3.1 - 簡單搜索三個(或更多)模型?

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]}%"]) 

我真的需要能夠搜索藝術家。我會怎麼做呢?我最好在產品控制器中使用它,因爲它是我需要顯示的產品列表。

我試過添加:連接=>:藝術家及其變體,但似乎沒有工作。

我知道有像斯芬克斯這樣的全面搜索選項,但現在我只需要這個簡單的方法來工作。

在此先感謝!

回答

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個單獨的查詢。

+0

這看起來不錯,正是我所需要的,但是,它給了我一個錯誤:ProductsController中的HasManyThroughAssociationNotFoundError - 找不到關聯:產品模型中的關聯:我知道這不是一個有很多通過,所以我們如何做到這一點期望一對多的關係? – Raoot

+0

請注意連接關聯名稱中單數':release',而表名中的複數'releases.title'。 Crucial :) –

+0

是的,我喜歡它。正如我測試我刪除了所有引用釋放和錯誤總是相同的!?! – Raoot

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 

並且可以使您的代碼相應地針對每個對象進行操作。


希望我幫了忙。

+0

謝謝我認爲Viktor的答案更接近我的想法,但是這給了我一個錯誤,所以我會看看我是否可以讓你的建議工作。非常感謝 – Raoot