0

На первый взгляд это может показаться простым вопросом. Возможно, вы даже подозреваете, что ответ был получен раньше, но не довольно. Я потратил много усилий на очистку сети (включая переполнение стека) и не смог найти ответ.has_one и принадлежит_от вместе

Это самая близкая вещь, которую я мог найти: Using has_one and belongs_to together, однако это не совсем ответит на мой вопрос.

Я использую Rails 4 и MySQL

Структура базы данных выглядит следующим образом:

партнеры таблицы

id 
name 
primary_contact_id 

стол контакты

id 
partner_id 
first_name 
last_name 

Довольно прямо вперед, вправо ? Само собой разумеется.

class Partner < ActiveRecord::Base 

    has_one :primary_contact, :class_name => "Partners::Contact", :primary_key => 'primary_contact_id' 

    has_many :contacts, :class_name => "Partners::Contact" 

    accepts_nested_attributes_for :primary_contact 

    validates_presence_of :primary_contact 

end 

class Partners::Contact < ActiveRecord::Base 

    belongs_to :partner 

end 

Как вы можете видеть, при создании партнера, первичный контакт требуется (форма и т.д., все настроено правильно)

Единственная проблема, я испытываю то, что при создании primary_contact наряду с партнером, ActiveRecord не понимает, что ему необходимо назначить partner_id для создаваемого контакта, создаваемого partner_id ...

Лучшие практики здесь? Я не хочу создавать столбец в таблице контактов, который указывает (bool или иначе), если этот контакт является первичным или нет. Это не нормальная нормализация базы данных (независимо от того, что означает «rails convention»).

Спасибо за помощь и мысли!

ответ

0

Я предполагаю, что вы создаете партнер по аналогии с этим:

Partner.create params[:partner] # { ..., primary_contact: {} } 

Так нет пути рельсов не могут знать, что вы создаете контакт здесь. Одним простым решением без корректировки схемы было бы использовать дополнительный запрос для нормализации данных:

class Partner 
    after_create :update_primary_contact 

    def update_primary_contact 
    self.contacts << self.primary_contact 
    end 
end 
+0

Это звучит неплохо. Я просто попробовал это, однако из-за того, что партнер создан params.require (: partner) .permit (: company_name, ... primary_contact_attributes: ...) Мои тесты все еще не работают ... – Volte

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