Ни один из предыдущих ответов не помог мне решить эту проблему, поэтому я поставлю это здесь, если кто-нибудь еще столкнется с этим. Использование Rails 4.2 +.
Создайте миграцию (если у вас уже есть таблица адресов):
class AddPolymorphicColumnsToAddress < ActiveRecord::Migration
def change
add_column :addresses, :addressable_type, :string, index: true
add_column :addresses, :addressable_id, :integer, index: true
add_column :addresses, :addressable_scope, :string, index: true
end
end
Настройка вашей полиморфной ассоциации:
class Address < ActiveRecord::Base
belongs_to :addressable, polymorphic: true
end
Установите класс, из которого будет вызываться ассоциация:
class Order < ActiveRecord::Base
has_one :bill_address, -> { where(addressable_scope: :bill_address) }, as: :addressable, class_name: "Address", dependent: :destroy
accepts_nested_attributes_for :bill_address, allow_destroy: true
has_one :ship_address, -> { where(addressable_scope: :ship_address) }, as: :addressable, class_name: "Address", dependent: :destroy
accepts_nested_attributes_for :ship_address, allow_destroy: true
end
Хитрость в том, что вы должны вызывать метод сборки для экземпляра Order
, иначе столбец scope
не будет заполнен.
Так что это НЕ работает:
address = {attr1: "value"... etc...}
order = Order.new(bill_address: address)
order.save!
Однако, это РАБОТАЕТ.
address = {attr1: "value"... etc...}
order = Order.new
order.build_bill_address(address)
order.save!
Надеюсь, это поможет кому-то еще.