has_one: through: 不添加构造函数

Posted

技术标签:

【中文标题】has_one: through: 不添加构造函数【英文标题】:has_one: through: does not add constructors 【发布时间】:2013-03-20 06:59:04 【问题描述】:

我对 rails 和 ActiveRecord 还很陌生,我不明白为什么 rails 不会为以下模型设置生成 User.build_company 方法:

class User < ActiveRecord::Base
  has_one :found_company
  has_one :company, through: :found_company
end

class FoundCompany < ActiveRecord::Base

  belongs_to :user
  belongs_to :company
end

class Company < ActiveRecord::Base
  has_many :found_companies
  has_many :users, through: :found_companies
end

当我尝试调用 build 方法时会发生这种情况:

irb(main):035:0> user = User.all.first
    ?[1m?[36mUser Load (1.0ms)?[0m  ?[1mSELECT "users".* FROM "users" ?[0m
    => #<User id: 1, email: "user@example.com" [...] uid: nil>
    irb(main):036:0> user.build_company
NoMethodError: undefined method `build_company' for #<User:0x5bd50e0>

如果我将 has_one: through 更改为 has_many: through 一切都会按预期工作:

class User < ActiveRecord::Base
  has_many :found_companies
  has_many :companies, through: :found_companies
end

调用 user.companies.build 工作正常:

irb(main):041:0> f.companies.build
=> #<Company id: nil, name: nil, created_at:
[...]
irb(main):041:0>

为什么has_one: through 似乎不生成构建器方法?

【问题讨论】:

【参考方案1】:

据我所知user.companies.build 是正确的语法。我不知道 .build_company 作为实例化关联项的一种方式。

【讨论】:

afaik,对于 has_one 和 belongs_to 关联,它实际上是 build_association 而不是 object.other.build【参考方案2】:

我不知道为什么 Rails 不提供该方法,但是您可以通过执行以下操作来实现您想要的:

user.build_found_company.build_company

【讨论】:

哇,这行得通,但看起来很尴尬。为什么我需要显式处理连接表,而不是我可以直接访问公司的 has_many?

以上是关于has_one: through: 不添加构造函数的主要内容,如果未能解决你的问题,请参考以下文章

Kohana 3 ORM:构造函数“加载后”

NodeJs through处理流

ruby on rails(model)

Rails Association Has_One 具有复数模型名称而不是单数且不工作

Cancancan 通过能力检查传递一个对象

has_one belongs_to 关联 autosave => true 不保存