0

У меня есть много типов транспортных средств, все из которых имеют соответствующие марки. Каждый автомобиль имеет одну марку. И в этом сценарии ниже, я пытаюсь выяснить, как получить .brandable_type, чтобы быть равным .typeПолучение типа STI в полиморфном столе

Как мне вернуть base_class с типом Транспортное средство :: Автомобиль?

консоль:

vehicle = Vehicle.create(name: 'Mustang GT', type: 'Vehicle::Car') 
vehicle.create_brand!(name: 'Ford') 

Vehicle.find_by(name: 'Mustang GT').brand  #returns brand 
Brand.find_by(name: 'Ford').brandable_type  #returns 'Vehicle' not 'Vehicle::Car' 

Миграция:

class CreateVehicles < ActiveRecord::Migration 
    def change 
    create_table :vehicles do |t| 
     t.string :name 
     t.string :type 

     t.timestamps 
    end 

    add_index :vehicles, [:id, :type] 
    end 
end 


class CreateBrands < ActiveRecord::Migration 
    def change 
    create_table :brands do |t| 
     t.integer :brandable_id 
     t.string :brandable_type 

     t.string :name 

     t.timestamps 
    end 

    add_index :brands, [:brandable_id, :brandable_type] 
    end 
end 

Модель:

# app/models/vehicle.rb 
class Vehicle < ActiveRecord::Base 
    has_one :brand, class_name: Brand, as: :brandable 
end 

# app/models/vehicle/car.rb 
class Vehicle::Car < Vehicle 
end 

# app/models/vehicle/bicycle.rb 
class Vehicle::Bicycle < Vehicle 
end 

# app/models/brand.rb 
class Brand 
    belongs_to :brandable, polymorphic: true 

    def brandable_type=(sType) 
    super(sType.to_s.classify.constantize.base_class.to_s) 
    end 
end 
+0

Возможный дубликат [STI и полиморфов] (http://stackoverflow.com/questions/2603600/sti-and-polymorphs) – Doguita

ответ

0

Вы опущенная связывающий Автомобиль с брендом через :brandable:

class Vehicle < ActiveRecord::Base 
    has_one :brand, as: :brandable 
end 

Кроме того, я думаю, что ваша ассоциация не является правильной, если у вас нет конкретной причины, чтобы настроить ее так, потому что бренд и автомобиль звучат так, как будто они должны иметь отношения «один ко многим», более вероятно, что Бренд может иметь много транспортных средств, кроме марки, принадлежащих транспортному средству с ассоциацией 1-к-1

+0

Бренд также может существовать для одежды, продуктов питания вообще. Что касается ассоциации. Я действительно имел это как «has_one: brand, class_name: Brand, как:: brandable» ... Но я все равно получаю тот же результат. – levelone

+0

Brand.brandable_type возвращает Vehicle ... not Vehicle :: Car – levelone

+0

Ali, также ответьте также на ваш вопрос об отношениях. По внешнему виду всей области мы решили пойти по этому пути, учитывая логику этого проекта – levelone

 Смежные вопросы

  • Нет связанных вопросов^_^