1

我的模型和关联目前设置如下:

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创建模型的用户的 。现在,当我执行该创建方法时,它被设置为 nil。现在,这是有道理的,我明白为什么它不起作用。我只是不知道如何使这项工作。

我一直在为此挠头,无法弄清楚!你将如何做到这一点?

更新

注意:虽然这行得通,但下面的 Levi 的回答是一个更好的解决方案,这也是我最终选择的

我想通了,但我仍然希望得到有关这是否是解决此问题的最佳方法的反馈。我觉得可能有一个内置的rails方法可以做到这一点,我错过了

这是我更新的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
4

1 回答 1

1

当您创建版本时,我只会传入 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
于 2012-10-12T20:59:58.203 回答