我们说我们有一位用户。
用户通过帐户拥有多份文档,如此...
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
谢谢,它有点长,但我能想到一个简洁的解决方案。任何帮助将非常感激。
答案 0 :(得分:3)
您可以创建一个方法,该方法将在表documents
,accounts
和collaborators
上请求查找与用户相关的文档:
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...
,如果您不再需要它们,可以删除它们;否则,你必须给它们不同的名称(和上面的方法不同)。