0

比如我有这些模型:如何保存具有嵌套属性的多态模型的belongs_to关联?

class Person < ActiveRecord::Base 
    # attributes: id, name 
    has_one :address, as: :addressable 
    accepts_nested_attributes_for :address 
end 

class Company < ActiveRecord::Base 
    # attributes: id, name, main_address_id 
    has_one :address, as: :addressable 
    belongs_to :main_address, class_name: 'Address', foreign_key: :main_address_id 

    accepts_nested_attributes_for :main_address 

    def main_address_attributes=(attributes) 
    puts '='*100 
    puts attributes.inspect 
    self.build_main_address(attributes) 
    self.main_address.addressable_id = self.id 
    self.main_address.addressable_type = self.class.to_s 
    puts self.inspect 
    puts self.main_address.inspect 
    end 
end 

class Address < ActiveRecord::Base 
    # attributes: id, address1, address2, city_id,.. 
    belongs_to :addressable, polymorphic: true 
    validates :addressable_id, :addressable_type, presence: true 
end 

我试图挽救Company与嵌套属性,你可以假设这为PARAMS:

{"name"=>"Test Company", "email"=>"", "display_name"=>"Company pvt ltd", "description"=>"Company desc", "founded_in"=>"2014-08-05", "website"=>"", "main_address_attributes"=>{"address1"=>"My address1", "address2"=>"My address2", "city_id"=>"10"}} 

这不工作,因为它拒绝并且在可寻址时不存储数据(addressable_idaddressable_type)为main_address不存在,即使当我试图在Company类的main_address_attributes=(attributes)方法中添加它时。

每当我试图挽救这与上述PARAMS我得到这个错误:

Main address addressable can't be blank 

我该如何解决这个问题?

+0

你想保存'company'这是相关到'地址'(通过'main_address_id'),该地址通过'addressab返回到另一个地方('Company'或'Person') le'? – IS04 2014-08-31 17:12:13

+0

不,“Company”有两个独立的地址,一个是主地址,另一个是可选地址,“Person”可以有一个地址,但不在话题中。我需要的是将main_address_id保存为创建的'Address'id,并指向创建的'Company'的可寻址方式。我希望有所帮助。 – Surya 2014-08-31 17:17:01

+0

在这种情况下,你应该使用相同的'多态'关系(否则你会得到一些关于我上面写的东西) – IS04 2014-08-31 17:24:36

回答

0

万一有belongs_to你会碰到这样的:company相关address(通过main_address_id),它的回报是通过多态addressable与另一个(CompanyPerson)。

至于例如,你可以改变:

has_one :address, as: :addressable 

到:

has_many :address, as: :addressable 

,然后添加到您的Address

enum address_type: [:primary, :secondary] 
+0

我觉得这是唯一的选择,谢谢! – Surya 2014-09-03 16:16:26