2015-10-17 8 views
0

Я создаю приложение с Rails 4.Рельсы: полиморфные ассоциации

У меня есть модель телефона и модель телефона. Каждый из них определяется как полиморфный с рядом других моделей, поэтому их можно использовать во всех приложениях, например, у пользователя есть номер телефона, но также и компания. Они могут быть разными. У компании есть адрес, и он может использоваться пользователем по умолчанию, или они могут добавить еще один как свой собственный.

В моем коде, у меня есть адрес модели, как:

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 
Смежные вопросы