2010-10-07 4 views
1

Я использую accepts_nested_attributes_for со следующими моделями: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 не создавать новую запись умения, если запись с тем же именем навыка уже существует?

+0

Вы когда-нибудь находили решение для этого? У меня есть точно такая же настройка с 'validates: name, presence: true, uniqueiquity: true' на Skill. При вводе навыка с тем же именем в форме вложенных атрибутов я получаю ошибку проверки уникальности. Я хотел бы иметь возможность использовать существующий навык, если имя совпадает. – scttnlsn

ответ

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 
+0

Я пробовал это недавно, и я не могу заставить это работать. Является ли этот способ сделать это все еще возможным? Каким будет правильный способ сделать это без использования 'accepts_nested_attributes_for'? – Kevin

Смежные вопросы