Rails: Как использовать ассоциацию own_to для ссылок в дополнение к ассоциации has_many? - PullRequest
1 голос
/ 14 июля 2011

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

class User < ActiveRecord::Base
  has_many :addresses
  belongs_to :main_address, :class_name => 'Address', :foreign_key => 'main_address_id'

  accepts_nested_attributes_for :main_address
end


class Address < ActiveRecord::Base
  belongs_to :user # used for has_many
end

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

Я получаю следующую ошибку: SQLite3::ConstraintException: addresses.user_id may not be NULL:

Проблема заключается в том,что адрес строится через main_address.build, а адрес не получает внешний ключ user_id, потому что он строится через main_address.

Понятия не имею :( Как я могу использовать ассоциацию own_to дляправильно сослаться на ассоциацию has_many?

Ответы [ 2 ]

0 голосов
/ 15 июля 2011

Хотя я согласен с lukewendling, альтернативой является установление ассоциации в Address (до User) и затем использование before_save для обновления user_id при необходимости.Как то так:

has_one :main_user, :class_name => 'User', :foreign_key => 'main_address_id'

before_save :update_user_id

def update_user_id
  if main_user.present?
    self.user_id = main_user.id
  end
end
0 голосов
/ 14 июля 2011

Ваше моделирование "реального" мира кажется немного странным, и аналогично, ассоциация, которую вы пытаетесь создать, сложна. Пользователь, кажется, не принадлежит к MainAddress, так же как пользователь не принадлежит к ее PrimaryVehicle. Почему бы не иметь логическое значение для модели Address, например Address # primary?

...