可以在Rails中为belongs_to关联设置别名吗?

时间:2014-01-31 01:42:31

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 ruby-on-rails-4

我有一个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, :vendoralias_method :company=, :vendor=吗?

4 个答案:

答案 0 :(得分:64)

不,它不会查找company_id,例如更改您的代码,如下所示

在Rails3中

class Car < ActiveRecord::Base
   belongs_to :vendor
   belongs_to :company, :class_name => :Vendor,:foreign_key => "vendor_id"
end

在Rails4中

我们可以使用别名属性。

alias_attribute :company, :vendor

答案 1 :(得分:28)

在Rails 4中,您只需将alias_attribute :company, :vendor添加到模型中即可。

答案 2 :(得分:8)

简短版本:

  1. 使用迁移生成模型

    $ rails generate model Car vendor:references name:string ...

  2. Car模型中添加以下行,即car.rb文件

    class Car < ActiveRecord::Base
      belongs_to :company, :class_name => 'Vendor', :foreign_key => 'vendor_id'
    end
    
  3. 现在您拥有@car.company实例方法。

  4. 有关详细说明,请提前阅读 [如果您理解上述内容,则选择!!]

    详细版本:

    模型Car将与模型Vendor建立关联(很明显)。因此表vendor_id中应该有cars

    1. 为了确保vendor_id表中存在字段cars,请在命令行上运行以下命令。这将生成正确的迁移。 vendor:references很重要。之后您可以拥有任意数量的属性。

      $ rails generate model Car vendor:references name:string

    2. 或者在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
      
    3. 您需要做的最后一件事是编辑模型Car。因此,请将此代码添加到car.rb文件

      class Car < ActiveRecord::Base
        belongs_to :company, :class_name => 'Vendor', :foreign_key => 'vendor_id'
      end
      
    4. 执行第三步后,您将获得Rails Associations提供的模型Car的以下实例方法

      1. @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字段中。

      2. 谢谢。

答案 3 :(得分:3)

class Car < ActiveRecord::Base
  belongs_to :vendor
  belongs_to :company, :class_name => :Vendor
end