1

私は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ビルダーメソッドが生成されないように見えるのはなぜですか?

4

2 に答える 2

0

私が知る限りuser.companies.build、正しい構文です。.build_companyインスタンス化の方法として関連付けられたアイテムを認識していません。

于 2013-03-20T07:21:08.760 に答える
0

Railsがメソッドを提供しない理由はわかりませんが、次のようにすることで目的を達成できます。

user.build_found_company.build_company
于 2013-03-20T12:10:15.623 に答える