我有一个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=
吗?
答案 0 :(得分:64)
不,它不会查找company_id,例如更改您的代码,如下所示
class Car < ActiveRecord::Base
belongs_to :vendor
belongs_to :company, :class_name => :Vendor,:foreign_key => "vendor_id"
end
我们可以使用别名属性。
alias_attribute :company, :vendor
答案 1 :(得分:28)
在Rails 4中,您只需将alias_attribute :company, :vendor
添加到模型中即可。
答案 2 :(得分:8)
简短版本:
使用迁移生成模型
$ 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
执行第三步后,您将获得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
保存在vendor_id
表的cars
字段中。
谢谢。
答案 3 :(得分:3)
class Car < ActiveRecord::Base
belongs_to :vendor
belongs_to :company, :class_name => :Vendor
end