Ruby on rails Rails中的多模型错误
我的应用程序有三种模式:Ruby on rails Rails中的多模型错误,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,model,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,Model,我的应用程序有三种模式:公司,大学和组织 这三个模型之间的关系是: class Company < ActiveRecord::Base has_many :formations, dependent: :destroy end class University < ActiveRecord::Base has_many :formations, dependent: :destroy end class Formation < ActiveRecord::Ba
公司
,大学
和组织
这三个模型之间的关系是:
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
class公司
因此,在这个应用程序中,我想在表单中列出同一领域的大学和公司的列表,这就是我在表单中使用此代码的原因:
<% 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" %>
这段代码运行得很好,但问题是当我尝试创建一个新的表单并选择大学名称时,我遇到了这个错误
公司(#-650866168)预期,获得大学(#-647908008)
对于
self.company=公司或大学
。如何解决这个问题?我认为这个错误很容易解释:您不能使用公司
关联来存储大学
,因为预期的对象是公司
我相信,如果你像这样重写你的二传手,你会得到你想要的结果:
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
class Formation
作为旁注,我认为,通过使用一个而不是简单的关联和自定义setter和getter方法,可以改进此实现。这对于新记录是可行的,但当我尝试编辑一个已经使用公司名称的记录并尝试选择一个大学名称时,此大学名称不会被保存,这就是为什么我强烈建议转向多态性关联,或任何类似的实现。这样,你会在兔子洞里越陷越深。。。但是,让我们看看我的编辑是否解决了您的问题(即您将有
大学
和公司
与编辑的记录关联)。现在,当我尝试在EDIT中保留大学名称而不是公司名称时,我得到了相反的结果。我认为这将起作用,因为我已经将代码更改为此代码,并且如果大学名称为self.university=university\u from\u name self.company=nil else self.university=nil self.company=Company.where(name:name)。first_或_create endit正在工作非常感谢,但是你能告诉我多态关联比这种方法有什么优势吗