Rails 中的多模型错误
Multiple model error in Rails
我有一个包含三个模型的应用程序:company
、university
和 formation
。
这三个模型之间的关系是:
class Company < ActiveRecord::Base
has_many :formations, dependent: :destroy
end
class University < ActiveRecord::Base
has_many :formations, dependent: :destroy
end
class Formation < ActiveRecord::Base
#company
belongs_to :company
#universities
belongs_to :university
def company_name
(company or university).try(:name)
end
def company_name=(name)
company_or_university = University.where(name: name).first
company_or_university ||= Company.where(name: name).first_or_create
self.company = company_or_university
end
end
所以在这个应用程序中,我想下拉列表中的大学和公司在同一领域的形成形式,这就是为什么我在我的形成形式中使用这个代码:
<% companies_or_universities = (Company.all.pluck(:name) + University.all.pluck(:name)).sort %>
<%= f.text_field :company_name, data: {autocomplete_source: companies_or_universities}, required: true, class: "form-control form-newjob" %>
此代码工作正常,但问题是当我尝试创建一个新编队并选择大学名称时,出现此错误
Company(#-650866168) expected, got University(#-647908008)
为 self.company = company_or_university
。我该如何解决这个问题?
我认为这个错误很容易解释:您不能使用 Company
关联来存储 University
,因为预期的对象是 Company
。
我相信,如果您像这样重写 setter,您会得到想要的结果:
class Formation < ActiveRecord::Base
def company_name=(name)
university_from_name = University.where(name: name).first
if university_from_name
self.university = university_from_name
self.company = nil if persisted?
else
self.company = Company.where(name: name).first_or_create
self.university = nil if persisted?
end
end
end
附带说明一下,我认为可以通过使用 polymorphic association 而不是普通关联和自定义 setter 和 getter 方法来改进此实现。
我有一个包含三个模型的应用程序:company
、university
和 formation
。
这三个模型之间的关系是:
class Company < ActiveRecord::Base
has_many :formations, dependent: :destroy
end
class University < ActiveRecord::Base
has_many :formations, dependent: :destroy
end
class Formation < ActiveRecord::Base
#company
belongs_to :company
#universities
belongs_to :university
def company_name
(company or university).try(:name)
end
def company_name=(name)
company_or_university = University.where(name: name).first
company_or_university ||= Company.where(name: name).first_or_create
self.company = company_or_university
end
end
所以在这个应用程序中,我想下拉列表中的大学和公司在同一领域的形成形式,这就是为什么我在我的形成形式中使用这个代码:
<% companies_or_universities = (Company.all.pluck(:name) + University.all.pluck(:name)).sort %>
<%= f.text_field :company_name, data: {autocomplete_source: companies_or_universities}, required: true, class: "form-control form-newjob" %>
此代码工作正常,但问题是当我尝试创建一个新编队并选择大学名称时,出现此错误
Company(#-650866168) expected, got University(#-647908008)
为 self.company = company_or_university
。我该如何解决这个问题?
我认为这个错误很容易解释:您不能使用 Company
关联来存储 University
,因为预期的对象是 Company
。
我相信,如果您像这样重写 setter,您会得到想要的结果:
class Formation < ActiveRecord::Base
def company_name=(name)
university_from_name = University.where(name: name).first
if university_from_name
self.university = university_from_name
self.company = nil if persisted?
else
self.company = Company.where(name: name).first_or_create
self.university = nil if persisted?
end
end
end
附带说明一下,我认为可以通过使用 polymorphic association 而不是普通关联和自定义 setter 和 getter 方法来改进此实现。