我有User
模型,其中有许多projects
和Project
模型,可以有很多users
,但也属于单个用户(即用户创建了这个项目)。它必须属于User
。它还允许用户列表与之关联,认为协作。
考虑到这一点,我的模型看起来像这样:
class User < ActiveRecord::Base
has_many :assigned_projects
has_many :projects, :through => :assigned_projects
end
class Project < ActiveRecord::Base
belongs_to :user
has_many :assigned_projects
has_many :users, :through => :assigned_projects
end
class AssignedProject < ActiveRecord::Base
belongs_to :user
belongs_to :project
end
现在,当我想通过User
创建一个新项目时,我就是这样做的:
user = User.create(:name => 'injekt')
user.projects.create(:name => 'project one')
现在,我知道projects
是通过AssignedProject
加入模型提供的,这就是project.user
将返回nil
的原因。我正在努力解决的问题是分配项目创建者的最佳方式(顺便说一下 不是user
,可能是creator
或其他描述性的东西,只要它是User
)类型。
然后,我们的想法是创建一个从projects_created
返回User
的方法,该方法将仅选择此用户创建的项目。其中user.projects
当然会返回用户所关联的所有项目。
假设这种关联相当普遍,那么实现我想要的最好方法是什么?任何方向都非常感谢。
答案 0 :(得分:20)
将creator_id列添加到项目表中以获取创建者关系,然后将关联添加到模型中:
class User < ActiveRecord::Base
has_many :assigned_projects
has_many :projects, :through => :assigned_projects
has_many :created_projects, :class_name => "Project", :foreign_key => :creator_id
end
class Project < ActiveRecord::Base
belongs_to :user
has_many :assigned_projects
has_many :users, :through => :assigned_projects
belongs_to :creator, :class_name => "User", :foreign_key => :creator_id
end
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many
答案 1 :(得分:1)
我想对设计几乎没有什么改进。我们实际上并不需要中间模型,因为它不包含除reference_ids之外的任何额外列,因此HABTM关联最适合此处。
class User < ActiveRecord::Base
has_and_belongs_to_many :projects, :join_table => :assigned_projects
has_many :created_projects, :class_name => "Project", :foreign_key => :creator_id
end
class Project < ActiveRecord::Base
has_and_belongs_to_many :users, :join_table => :assigned_projects
belongs_to :creator, :class_name => "User", :foreign_key => :creator_id
end