Подтвердить что ты не робот

Возможна ли псевдонима ассоциация belongs_to в Rails?

У меня есть модель с ассоциацией 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=?

4b9b3361

Ответ 1

Нет, он не ищет company_id, например, измените свой код следующим образом

В Rails3

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

В Rails4

Мы можем использовать атрибут alias.

alias_attribute :company, :vendor

Ответ 2

В Rails 4 вы должны просто добавить alias_attribute :company, :vendor в свою модель.

Ответ 3

Краткая версия:

  • Создать модель с миграцией

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

  • Добавить следующую строку в Car model i.e car.rb file

    class Car < ActiveRecord::Base
      belongs_to :company, :class_name => 'Vendor', :foreign_key => 'vendor_id'
    end
    
  • Теперь у вас есть метод экземпляра @car.company.

Подробное объяснение читается вперед [Необязательно, если вы поняли выше!]

Подробная версия:

Модель Car будет иметь связь с моделью Vendor (что очевидно). Поэтому в таблице cars должно быть vendor_id.

  • Чтобы убедиться, что поле 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.

Спасибо.

Ответ 4

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