belongs_to
関連のモデルがあります:
class Car < ActiveRecord::Base
belongs_to :vendor
end
したがって、car.vendor
を呼び出すことができます。しかし、car.company
も呼び出したいです!だから、私は次のものを持っています:
class Car < ActiveRecord::Base
belongs_to :vendor
def company
vendor
end
end
しかし、それは割り当て状況car.company = 'ford'
を解決しないので、そのための別のメソッドを作成する必要があります。関連付けに使用できる簡単なalias
メカニズムはありますか? alias_method :company, :vendor
とalias_method :company=, :vendor=
だけを使用できますか?
いいえ、たとえばcompany_idを探しません。次のようにコードを変更します。
class Car < ActiveRecord::Base
belongs_to :vendor
belongs_to :company, :class_name => :Vendor,:foreign_key => "vendor_id"
end
エイリアス属性を使用できます。
alias_attribute :company, :vendor
Rails 4では、単にalias_attribute :company, :vendor
あなたのモデルに。
ショートバージョン:
移行でモデルを生成する
$ Rails generate model Car vendor:references name:string ...
Car
モデル、つまりcar.rb
ファイルに次の行を追加します
class Car < ActiveRecord::Base
belongs_to :company, :class_name => 'Vendor', :foreign_key => 'vendor_id'
end
これで、@car.company
インスタンスメソッドができました。
詳細な説明については、先読み[上記を理解した場合はオプション!!]
詳細バージョン:
モデルCar
は、モデルVendor
(これは明らかです)と関連付けられます。したがって、テーブルcars
にはvendor_id
が必要です。
vendor_id
フィールドがcars
テーブルに存在することを確認するには、コマンドラインで次を実行します。これにより、適切な移行が生成されます。 vendor:references
は重要です。その後、属性をいくつでも持つことができます。
$ Rails generate model Car vendor:references name:string
または、create_table :cars
の既存の移行でt.references :vendor
行を追加するだけです
class CreateCars < ActiveRecord::Migration
def change
create_table :cars do |t|
t.string :name
...
t.references :vendor
t.timestamps
end
end
end
最後に行う必要があるのは、モデルCar
を編集することです。したがって、このコードをcar.rb
ファイルに追加します
class Car < ActiveRecord::Base
belongs_to :company, :class_name => 'Vendor', :foreign_key => 'vendor_id'
end
3番目の手順を実行すると、Rails Associationsによって提供されるモデルCar
の次のインスタンスメソッドが取得されます。
@car.company
@car.company
を実行すると、#<Vendor ...>
オブジェクトが返されます。 #<Vendor ...>
オブジェクトを見つけるには、vendor_id
に言及しているため、cars
テーブルの:foreign_key => 'vendor_id'
列を探します。
次のように書くことで、自動車インスタンスの会社を設定できます。
@car.company = @vendor || Vendor.find(params[:id]) #whichever Vendor object you want
@car.save
これにより、そのid
オブジェクトのVendor
がcars
テーブルのvendor_id
フィールドに保存されます。
ありがとうございました。
class Car < ActiveRecord::Base
belongs_to :vendor
belongs_to :company, :class_name => :Vendor
end