Rails has_many STI

时间:2016-07-07 22:19:00

标签: ruby-on-rails ruby-on-rails-4 has-many single-table-inheritance sti

我试图在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 

2 个答案:

答案 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添加到CarScheduledInstance型号?这可能需要您还添加对数据库的引用。

$ rails g migration add_task_id_to_car task:references
$ rake db:migrate

OR

您是否尝试过加入查询?

@task = Task.joins(:instances, :cars, :scheducled_instances).first