如何将两个has_many关联合并为一个?

时间:2012-09-28 09:00:52

标签: ruby-on-rails ruby-on-rails-3 activerecord associations

这似乎是一个相当普遍的问题,但没有确定的解决方案。再次重申,说我有一个模型:

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 个答案:

答案 0 :(得分: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