web-dev-qa-db-ja.com

Railsでbelongs_toアソシエーションをエイリアスすることは可能ですか?

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=だけを使用できますか?

45
at.

いいえ、たとえば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
65
pramod

Rails 4では、単にalias_attribute :company, :vendorあなたのモデルに。

29
Fran Worley

ショートバージョン:

  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インスタンスメソッドができました。

詳細な説明については、先読み[上記を理解した場合はオプション!!]

詳細バージョン:

モデルCarは、モデルVendor(これは明らかです)と関連付けられます。したがって、テーブルcarsにはvendor_idが必要です。

  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
    

3番目の手順を実行すると、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オブジェクトのVendorcarsテーブルのvendor_idフィールドに保存されます。

ありがとうございました。

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