Possible to alias a belongs_to association in Rails?

前端 未结 4 1644
情书的邮戳
情书的邮戳 2020-12-25 10:18

I have a model with a belongs_to association:

class Car < ActiveRecord::Base
  belongs_to :vendor
end

So I can call c

相关标签:
4条回答
  • 2020-12-25 10:25

    No it doesn't look for company_id for instance change your code as follows

    In Rails3

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

    In Rails4

    We can use alias attribute.

    alias_attribute :company, :vendor
    
    0 讨论(0)
  • 2020-12-25 10:25

    Short Version:

    1. Generate model with migration

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

    2. Add following line in Car model i.e car.rb file

      class Car < ActiveRecord::Base
        belongs_to :company, :class_name => 'Vendor', :foreign_key => 'vendor_id'
      end
      
    3. Now you have @car.company instance method.

    For a Detailed explanation read ahead [Optional if you understood the above !!]

    Detailed Version:

    The model Car will have an association with the model Vendor (which is obvious). So there should be a vendor_id in the table cars.

    1. In order to make sure that the field vendor_id is present in the cars table run the following on the command line. This will generate the right migration. The vendor:references is important. You can have any number of attributes after that.

      $ rails generate model Car vendor:references name:string

    2. Or else in the existing migration for create_table :cars just add the line 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. The final thing that you need to do is edit the model Car. So add this code to your car.rb file

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

    After you do the third step you will get the following instance methods for the model Car provided by Rails Associations

    1. @car.company

      • When you do @car.company it will return a #<Vendor ...> object. To find that #<Vendor ...> object it will go look for the vendor_id column in the cars table because you have mentioned :foreign_key => 'vendor_id'

      • You can set the company for a car instance by writing

        @car.company = @vendor || Vendor.find(params[:id]) #whichever Vendor object you want
        @car.save
        

        This will save the id of that Vendor object in the vendor_id field of the cars table.

    Thank You.

    0 讨论(0)
  • 2020-12-25 10:25
    class Car < ActiveRecord::Base
      belongs_to :vendor
      belongs_to :company, :class_name => :Vendor
    end
    
    0 讨论(0)
  • 2020-12-25 10:29

    In Rails 4, you should simply be able to add alias_attribute :company, :vendor to your model.

    0 讨论(0)
提交回复
热议问题