1

私のモデルでは、プロジェクトは多くのユーザーを持ち、それらに属しているため、それらのための結合テーブル projects_users があります。行を挿入すると

@project.members += User.find params[:member_ids].split(',')

プロジェクトコントローラーの作成アクションに、@project を保存できません。試してみると、次のエラーが表示されます。

SQLite3::ConstraintException: constraint failed: INSERT INTO "projects_users" ("project_id", "user_id") VALUES (5, 14600)

ただし、保存の直前に、@project は有効であり、@project.members は正しいメンバーを返します。私は何を間違っていますか?

4

1 に答える 1

1

project_idの重複とuser_idペアを許可しないDB列に一意の制約があるようですがprojects_users、Railsはそれを認識していないため、検証はパスしますが、実際の保存は失敗します。

その場合はhas_many through、結合テーブルの関係とモデルを使用して、一意性を検証できます。あなたはすでにその一部を行っているのではないかと思います。このようなものが役立つかもしれません:

class Project < ActiveRecord::Base
  has_many :members
  has_many :users, through: :project_membership
end

class User < ActiveRecord::Base
  has_many :projects, through: :project_membership
end

class ProjectMembership < ActiveRecord::Base
  self.table_name = "projects_users"
  belongs_to :project
  belongs_to :user
  validates :project_id, uniqueness: { scope: :user_id }
end

上記の例のようにprojects_users、これがすべてうまくいく場合は、テーブルの名前を変更することをお勧めします。project_memberships次に、を捨てることができますself.table_name

于 2013-03-17T17:29:13.037 に答える