accepts_nested_attributes_for и новые записи - PullRequest
1 голос
/ 07 октября 2010

Я использую acceptpts_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

Таблица навыков имеет атрибут "имя". Как я могу принять accept_nested_attributes_, чтобы не создавать новую запись навыков, если запись с таким именем уже существует?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2011

Я думаю, что на этот вопрос здесь ответят: accept_nested_attributes_for with find_or_create?

0 голосов
/ 07 октября 2010

Вы можете избежать создания нового навыка, проверив его имя на уникальность:

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
...