2015-10-17 107 views
0

我建立使用Rails 4Rails的:多态关联

的应用程序我有一个地址模型和手机型号。它们中的每一个都被定义为与多个其他模型的多态性,以便它们可以在整个应用程序中使用 - 例如,用户具有电话号码,但公司也是如此。他们的数字可能不同。该公司有一个地址,它可以被用户用作默认地址,或者他们可以添加另一个地址作为自己的地址。

在我的代码,我有一个地址模型:

class Address < ActiveRecord::Base 

    geocoded_by :full_address_map # can also be an IP address 


    # --------------- associations 

    belongs_to :addressable, :polymorphic => true 

    # --------------- scopes 

    # --------------- validations 

    validates_presence_of :unit, :street, :zip, :country 


    # --------------- class methods 

    def first_line 
    [unit, street].join(' ') 
    end 

    def middle_line 
    if self.building.present? 
    end 
    end 

    def last_line 
    [city, region, zip].join(' ') 
    end 

    def country_name 
    self.country = ISO3166::Country[country] 
    country.translations[I18n.locale.to_s] || country.name 
    end 

    def address_without_country 
    [self.first_line, middle_line, last_line].compact.join(" ") 
    end 

    def full_address_map 
    [self.first_line, middle_line, last_line, country_name.upcase].compact.join("<br>").html_safe 
    end 

    def full_address_formal 
    [self.first_line, middle_line, last_line, country_name].compact.join(" ").html_safe 
    end 


    # --------------- callbacks 

    after_validation :geocode#, if self.full_address.changed? 

    # --------------- instance methods 

    # --------------- private methods 

    protected 

end 

在我的地址_form部分,我有用户填写表格。

在我的组织模式,我有:

class Organisation < ActiveRecord::Base 

    # --------------- associations 

    has_one :user # the user that is the representative 
    has_many :profiles # the users who have roles within the org 


    has_many :addresses, :as_addressable 
    has_many :phones, :as_phoneable 


    # --------------- scopes 



    # --------------- validations 

    # --------------- class methods 


    def address 
    self.address.full_address_formal 
    end 


    # --------------- callbacks 

    # --------------- instance methods 

    # --------------- private methods 


end 

在我的组织控制,新的行动,我有:

def new 
    @organisation = Organisation.new 
    @organisation.build_address 
end 

当我尝试这一点,我有这样的错误:

NoMethodError at /organisations/new 
undefined method `arity' for :as_addressable:Symbol 

在我的地址表中,我有:

t.integer "addressable_id" 
t.string "addressable_type" 
add_index "addresses", ["addressable_type", "addressable_id"], name: "index_addresses_on_addressable_type_and_addressable_id", unique: true, using: :btree 

我不明白错误的性质。这个结构缺失了什么?

回答

1

多态关联在声明中需要as选项。

has_many :addresses, as: :addressable 
has_many :phones, as: :phoneable