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もらいたいと思います。現在、そのcreateメソッドを実行すると、nilに設定されています。さて、これは理にかなっています、そして私はそれがうまくいかない理由を理解しています。私はこれを機能させる方法を理解できません。user_idVersionuser_id

私はこれに頭を悩ませてきました、そしてそれを理解することができません!これをどのように達成しますか?

アップデート

注:これは機能しましたが、以下の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
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、バージョンモデルに(または適切なものを)追加してみませんか?これは、バージョンからプロジェクトに移行するための1つの追加の結合ですが、データモデルの方が理にかなっています。

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 に答える