在Rails中,您如何将这两个不同的has_manys合并为一个?

时间:2013-07-06 13:42:21

标签: ruby-on-rails ruby-on-rails-3 activerecord has-many-through has-many

我们说我们有一位用户。

用户通过帐户拥有多份文档,如此...

class User < ActiveRecord::Base
  belongs_to :account
  has_many :documents, :through => :account, :order => "created_at DESC"
end

class Account < ActiveRecord::Base
  has_one :owner, :class_name => "User", :dependent => :destroy
  has_many :documents, :dependent => :destroy
end

class Document < ActiveRecord::Base
  belongs_to :account
end

很好很简单,这就是它变得棘手的地方......

用户还可以通过协作者加入表格来协作处理文档......

class Collaborator < ActiveRecord::Base
  belongs_to :user
  belongs_to :documnet
end

class Document < ActiveRecord::Base
  has_many :collaborators, :dependent => :destroy
  has_many :users, :through => :collaborators
  accepts_nested_attributes_for :collaborators, :allow_destroy => true
end

这个的最后用户位是我不确定的。我想添加另一个有很多文档,当你调用user.documents时,它会通过他们的帐户和他们正在合作的文件混合两个文件......

class User < ActiveRecord::Base
  belongs_to :account
  has_many :documents, :through => :account, :order => "created_at DESC"

  #documents need to do both has manys…
  has_many :collaborators, :dependent => :destroy
  has_many :documents, :through => :collaborators
end

谢谢,它有点长,但我能想到一个简洁的解决方案。任何帮助将非常感激。

1 个答案:

答案 0 :(得分:3)

您可以创建一个方法,该方法将在表documentsaccountscollaborators上请求查找与用户相关的文档:

class User < ActiveRecord::Base

  #...

  def documents
    Document.includes(:account, :collaborators).where('collaborators.user_id = ? OR documents.account_id = ?', self.id, self.account.id)
  end

end

我没有测试过这个请求,但我希望你明白这个想法。如果错误,请更正。

对于2 has_many documents, :through...,如果您不再需要它们,可以删除它们;否则,你必须给它们不同的名称(和上面的方法不同)。