Возможна ли псевдонима ассоциация 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=
?
Ответы
Ответ 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