【问题标题】:Multiple model error in RailsRails 中的多个模型错误
【发布时间】:2015-02-07 16:51:26
【问题描述】:

我有一个包含三个模型的应用程序:companyuniversityformation

这三个模型之间的关系是:

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" %>

此代码运行良好,但问题是当我尝试创建新队形并选择大学名称时,我收到此错误

预期公司(#-650866168),获得大学(#-647908008)

self.company = company_or_university。我该如何解决这个问题?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 activerecord model


    【解决方案1】:

    我认为这个错误很容易解释:你不能使用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 方法来改进此实现。

    【讨论】:

    • 这是为新记录工作,但是当我尝试编辑已使用公司名称的记录并尝试选择大学名称时,该大学名称未保存
    • 这就是为什么我强烈建议转向多态关联或任何类似的实现。这样,您将在兔子洞中越来越深...但是让我们看看我的编辑是否解决了您的问题(即您将同时拥有 UniversityCompany 与编辑的记录相关联)。
    • 现在我在尝试保留大学名称但不是编辑公司名称时得到相反的结果
    • 我认为这会起作用,因为我已经将我的代码更改为这个,并且如果 university_from_name self.university = university_from_name self.company = nil else self.university = nil self.company = Company,它正在工作。 where(name: name).first_or_create end
    • 它正在工作,非常感谢你,但你能告诉我多态关联比这种方法有什么优势
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多