【发布时间】:2014-12-26 10:10:44
【问题描述】:
让我们使用这些类:
class User < ActiveRecord::Base
has_many :project_participations
has_many :projects, through: :project_participations, inverse_of: :users
end
class ProjectParticipation < ActiveRecord::Base
belongs_to :user
belongs_to :project
enum role: { member: 0, manager: 1 }
end
class Project < ActiveRecord::Base
has_many :project_participations
has_many :users, through: :project_participations, inverse_of: :projects
end
user 可以以member 或manager 的角色参与许多projects。连接模型称为ProjectParticipation。
我现在在使用未保存对象的关联时遇到问题。以下命令的工作方式与我认为的一样:
# first example
u = User.new
p = Project.new
u.projects << p
u.projects
=> #<ActiveRecord::Associations::CollectionProxy [#<Project id: nil>]>
u.project_participations
=> #<ActiveRecord::Associations::CollectionProxy [#<ProjectParticipation id: nil, user_id: nil, project_id: nil, role: nil>]>
到目前为止一切顺利 - AR 自己创建了ProjectParticipation,我可以使用u.projects 访问user 的projects。
但如果我自己创建ProjectParticipation 则不起作用:
# second example
u = User.new
pp = ProjectParticipation.new
p = Project.new
pp.project = p # assign project to project_participation
u.project_participations << pp # assign project_participation to user
u.project_participations
=> #<ActiveRecord::Associations::CollectionProxy [#<ProjectParticipation id: nil, user_id: nil, project_id: nil, role: nil>]>
u.projects
=> #<ActiveRecord::Associations::CollectionProxy []>
为什么项目是空的?我无法像以前一样通过u.projects 访问项目。
但如果我直接通过参与,项目就会出现:
u.project_participations.map(&:project)
=> [#<Project id: nil>]
它不应该像第一个示例一样直接工作吗:u.projects 将所有项目返回给我,而不取决于我是否自己创建连接对象?或者我怎样才能让 AR 意识到这一点?
【问题讨论】:
标签: ruby-on-rails activerecord has-many-through