Rails has_many并且属于一个

时间:2011-06-30 14:05:17

标签: ruby-on-rails associations has-many has-many-through belongs-to

我有User模型,其中有许多projectsProject模型,可以有很多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当然会返回用户所关联的所有项目。

假设这种关联相当普遍,那么实现我想要的最好方法是什么?任何方向都非常感谢。

2 个答案:

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