2012-09-28 86 views
1

這似乎是一個相當普遍的問題,但沒有明確的解決方案。再次重申,說我有一個模型:如何將兩個has_many關聯合併爲一個?

def Model < ActiveRecord::Base 
    has_many :somethings, ... 
    has_many :otherthings, ... 
end 

接下來的問題是如何增加一個第三關聯:combined,結合兩個?我知道這可以通過:finder_sql來完成,而類似的結果可以通過scope來實現,但是這些都沒有給我一個實際的關聯。這樣做的意義就在於能夠與:through和事物其用於其他關聯像Model.first.combined.some_scope.count

編輯:實際的代碼

class Donation < ActiveRecord::Base 
    # either Project or Nonprofit  
    belongs_to :donatable, :polymorphic => true 
    belongs_to :account 
end 

class Project < ActiveRecord::Base 
    belongs_to :nonprofit 
end 

class Nonprofit < ActiveRecord::Base 
    has_many :projects 

    # donations can be either direct or through a project 
    # the next two associations work fine on their own 

    # has_many :donations, :as => :donatable, :through => :projects 
    # has_many :donations, :as => :donatable 

    has_many :donations, ....      # how do I get both here, 
    has_many :supporters, :through => :donations # for this to work? 
end 

感謝的相關部分。

回答

1

如果SomethingOtherthing足夠相似,使用STI:

def Model < ActiveRecord::Base 
    has_many :somethings 
    has_many :otherthings 
    has_many :genericthings 
end 

def Genericthing < Activerecord::Base 
    # put a string column named "type" in the table 
    belongs_to :model 
end 

def Something < Genericthing 
end 

def Otherthing < Genericthing 
end 
+0

他們是同樣的事情,已經在使用STI,但其中一人來自':through'不同的模型。在那個定製的':finder_sql'中,我使用了LEFT JOIN和一個OR子句。 – Gunchars

+0

請更明確地說,將您的中間模型添加到原始問題中,以便每個人都可以瞭解要解決哪個問題。 – rewritten