我试图在rails 4上实现STI,但是我无法使其工作,我搜索了很多结果但没有效果。这是问题所在:
我有一个实例类,使用STI我有一个子类Car(一个虚拟子类)和ScheduledInstance类。
class Instance < ActiveRecord::Base
belongs_to :task
end
class Car < Instance end
class ScheduledInstance < Instance end
class Task < ActiveRecord::Base
has_many :instances, dependent: :destroy
has_many :cars
has_many :scheduledinstances
end
当尝试获取任务的汽车或任务的计划实例时,它不起作用。(我在实例表上有一个类型列)
Task.first.cars
Task Load (0.8ms) SELECT "tasks".* FROM "tasks" ORDER BY "tasks"."id" ASC LIMIT 1
NameError: uninitialized constant Task::Car
但是,如果我执行Task.first.instances,然后执行Task.first.cars,它可以正常工作。我错过了什么?。
同样根据您的回答,我需要应用哪些更改才能使其与has_many一起使用?
class Project < ActiveRecord::Base
has_many :tasks, dependent: :destroy
has_many :instances, through: :tasks
end
答案 0 :(得分:2)
我认为错误可能是由文件命名引起的。你能证实你有:
# models/car.rb
class Car < Instance
end
# models/scheduled_instance.rb
class ScheduledInstance < Instance
end
然后在你的task.rb中,你应该:
class Task < ActiveRecord::Base
has_many :instances, dependent: :destroy
has_many :cars
has_many :scheduled_instances
end
答案 1 :(得分:0)
我有几点建议:
您是否尝试将belongs_to :task
添加到Car
和ScheduledInstance
型号?这可能需要您还添加对数据库的引用。
$ rails g migration add_task_id_to_car task:references
$ rake db:migrate
OR
您是否尝试过加入查询?
@task = Task.joins(:instances, :cars, :scheducled_instances).first