1

次のモデルでaccepts_nested_attributes_forを使用しています。

ユーザーモデル:

class User < ActiveRecord::Base

  has_many :competences
  has_many :skills, :through => :competences, :foreign_key => :skill_id

  accepts_nested_attributes_for :skills
end

スキルモデル:

class Skill < ActiveRecord::Base
  has_many :competences
  has_many :users, :through => :competences, :foreign_key => :user_id
end

コンピテンシーモデル:

class Competence < ActiveRecord::Base
  belongs_to :user
  belongs_to :skill
end

スキルテーブルには「名前」属性があります。同じスキル名のレコードがすでに存在する場合、accepts_nested_attributes_forで新しいスキルレコードを作成しないようにするにはどうすればよいですか?

4

2 に答える 2

0

スキル名が一意であることを検証することで、新しいスキルの作成を回避できます。

class Skill < ActiveRecord::Base
  validates_uniqueness_of :name
end

ただし、実際に知りたいのは、既存のスキルがすでに存在する場合に新しいスキルを作成するのではなく、既存のスキルを新しいユーザーに指定した名前に関連付ける方法です。

あなたがそれを行おうとしているのなら、それは属性が実際にはまったくネストされるべきではないことを私に示唆しています。

before_save本当に必要な場合は、おそらくコールバックを使用してそれを行うことができますが、繰り返しになりますが、ネストされた属性の目的が無効になります。

class User << ActiveRecord::Base
  before_save :check_for_existing_skill
  def check_for_existing_skill
    if self.skill
      existing_skill = Skill.find_by_name(self.skill.name)
      if existing_skill
        self.skill = existing_skill
      end
    end
  end
end
于 2010-10-07T12:12:15.737 に答える
0

私はこの質問がここで答えられると思います:accepts_nested_attributes_for with find_or_create?

于 2011-02-25T02:00:15.690 に答える