Pregunta

Estoy usando accepts_nested_attributes_for con los siguientes modelos:

modelo de usuario:

class User < ActiveRecord::Base

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

  accepts_nested_attributes_for :skills
end

modelo Habilidad:

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

modelo de competencia:

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

La mesa de habilidad tiene un atributo "nombre". ¿Cómo puedo tener accepts_nested_attributes_for no crea un nuevo registro de habilidad si un registro con el mismo nombre de la habilidad ya existe?

¿Fue útil?

Solución

Se puede evitar la creación de una nueva habilidad al validar el nombre de la habilidad para ser único:

class Skill < ActiveRecord::Base
  validates_uniqueness_of :name
end

Creo que lo que realmente quiere saber, sin embargo, es cómo asociar la habilidad existente con el nombre que se han especificado al nuevo usuario en lugar de crear una nueva habilidad cuando ya existe.

Si usted está tratando de hacer que me hace pensar que los atributos no deben en realidad pueden anidar en absoluto.

Probablemente podría hacerlo con una devolución de llamada before_save si realmente quería pero una vez más, que tipo de derrotas el propósito de atributos anidados:

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

Otros consejos

Creo que esta pregunta se responde aquí: accepts_nested_attributes_for con find_or_create?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top