【问题标题】:Rails 5 Association id is set to nilRails 5 Association id 设置为 nil
【发布时间】:2019-12-10 13:27:04
【问题描述】:

我已将我们的产品从 Rails 2.3.48 升级到 Rails 5.2。

在 Rails 2 中

company = Company.first
User.new(company_id: company)
#<User id: nil, company_id: 1

在 Rails 5 中

company = Company.first
User.new(company_id: company)
#<User id: nil, company_id: nil

在 Rails 5 中,如果将 association_id 列分配给对象,则 Id 设置为 nil。我搜索了很多,但找不到任何东西有没有办法再次解决这种行为。

PS:由于产品非常大,我无法在我的代码库中将 company 更改为 company.id 或 company_id 为 company。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 associations upgrade


    【解决方案1】:

    这一点也不奇怪。 company_id= 设置器采用 id 而不是记录实例。

    如果要分配记录,请使用 company= 设置器。

    irb(main):001:0> company = Company.first
      Company Load (0.6ms)  SELECT "companies".* FROM "companies" ORDER BY "companies"."id" ASC LIMIT $1  [["LIMIT", 1]]
    => #<Company id: 1, name: "E Corp", created_at: "2019-12-10 13:36:21", updated_at: "2019-12-10 13:36:21">
    irb(main):002:0> User.new(company: company)
    => #<User id: nil, company_id: 1, created_at: nil, updated_at: nil>
    

    Rails 2 发布于 2007 年,当时框架还很不成熟,Rails 5 发布于 2015 年,因此更改和不兼容的数量是巨大的。在这种情况下,Rails 2 可能很松懈,只是为您调用了company=

    有趣的是,如果主键是整数列,Rails 只会在您传递的任何内容上调用 #to_i

    class Company < ApplicationRecord
      def to_i
        id
      end
    end
    
    irb(main):002:0> User.new(company_id: company)
    => #<User id: nil, company_id: 1, created_at: nil, updated_at: nil>
    irb(main):003:0> User.new(company_id: "abcd12345")
    => #<User id: nil, company_id: 0, created_at: nil, updated_at: nil>
    irb(main):004:0>  User.new(company_id: "123ABCD4")
    => #<User id: nil, company_id: 123, created_at: nil, updated_at: nil>
    

    不过,我并不是真的会推荐这个。使用搜索、替换和修复损坏的代码,而不是依赖糟糕的 hack。

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      相关资源
      最近更新 更多