我有我的模特&协会目前设置如下:
class User < ActiveRecord::Base
has_and_belongs_to_many :projects
has_many :versions, :through => :projects
end
class Projects < ActiveRecord::Base
has_many :versions
end
class Version < ActiveRecord::Base
belongs_to :project
attr_accessible :user_id, :project_id
before_create :associate_user
def associate_user
# I have no idea what to do here - in fact, I don't think this is even the right place to do this!
end
end
当我执行user.projects.first.versions.create
之类的操作时,我希望user_id
中的Version
字段填充创建模型的用户的user_id
。现在,当我执行该create方法时,它被设置为nil。现在,这是有道理的,我理解为什么它不起作用。我只是想弄清楚如何使这项工作。
我一直在摸不着头脑,无法弄清楚!你会如何做到这一点?
更新
注意:虽然这很有效,但Levi在下面的回答是一个更好,更好的解决方案,而且是我最终的目标
我明白了,但我仍然希望得到关于这是否是最好的解决方法的反馈。我觉得可能有一个内置的方法来执行此操作,我缺少
这是我更新的Version
模型:
class Version < ActiveRecord::Base
belongs_to :production
attr_accessible :user_id, :production_id
after_create :associate_user
def associate_user
@users = User.all(:include => :productions, :conditions => {"productions_users.production_id" => self.production_id})
@users.each do |user|
user.productions.each do |production|
if production.versions.exists?(self)
@version_user = user
end
end
end
self.user_id = @version_user.id
end
end
答案 0 :(得分:0)
我会在你创建版本时传递id。
user.projects.first.version.create(:user_id => user.id)
这样你根本不需要before_create
回调。
修改强>
您可能还想考虑您的数据库结构。您的版本表上有project_id和user_id。您还可以使用相同的键连接表(projects_users
)。为什么不把它变成一个真实的模型并在版本模型中添加belongs_to :user_project
(或任何合适的东西)?这是从版本到项目的一个额外连接,但数据模型更有意义。
class User < ActiveRecord::Base
has_many :user_projects
has_many :projects, :through => :user_projects
has_many :versions, :through => :projects
end
class UserProject < ActiveRecord::Base
belongs_to :user
belongs_to :project
has_many :versions
end
class Projects < ActiveRecord::Base
has_many :versions
has_many :user_projects
has_many :users, :through => :user_projects
end
class Version < ActiveRecord::Base
belongs_to :user_project
end