我有一个有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=
?
精简版:
使用迁移生成模型
$ 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
(这是显而易见的).所以vendor_id
桌子上应该有一个cars
.
为了确保表中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
完成第三步后,您将获得Car
Rails关联提供的模型的以下实例方法
@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
对象在vendor_id
该领域cars
表.
谢谢.
在Rails 4中,您应该只需添加alias_attribute :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