accepts_nested_attributes_for y nuevos registros
-
28-09-2019 - |
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?
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?