这一点也不奇怪。 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。