将self.id与rails中的嵌套模型before_create相关联

时间:2012-10-12 20:16:24

标签: ruby-on-rails ruby many-to-many polymorphic-associations rails-models

我有我的模特&协会目前设置如下:

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

1 个答案:

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