[英]Rails: polymorphic associations
I am building an app with Rails 4. 我正在使用Rails 4构建应用程序。
I have an address model and a phone model. 我有一个地址模型和一个电话模型。 Each of them are defined as polymporphic with a number of other models, so that they can be used across the application- for example, a user has phone number, but so does a company.
它们中的每一个都被定义为带有多种其他模型的多形模型,因此它们可以在整个应用程序中使用-例如,用户拥有电话号码,而公司也是如此。 They numbers could be different.
他们的数字可能不同。 The company has an address and it can be used by the user as a default, or they can add another one as their own.
公司有一个地址,用户可以将其用作默认地址,或者他们可以添加另一个地址作为自己的地址。
In my code, I have an address model as: 在我的代码中,我有一个地址模型为:
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
In my address _form partial, I have the form for users to complete. 在我的地址_form部分中,我有供用户填写的表单。
In my organisations model, I have: 在我的组织模型中,我有:
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
In my organisation controller, new action, I have: 在我的组织控制器中,新动作是:
def new
@organisation = Organisation.new
@organisation.build_address
end
When I try this, I have this error: 当我尝试此操作时,出现以下错误:
NoMethodError at /organisations/new
undefined method `arity' for :as_addressable:Symbol
In my address table, I have: 在我的地址表中,我有:
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
I don't understand the nature of the error. 我不了解错误的性质。 What is this structure missing?
这种结构缺少什么?
Polymorphic associations require the as
option in their declarations. 多态关联在其声明中需要
as
选项。
has_many :addresses, as: :addressable
has_many :phones, as: :phoneable
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.