Rails has_many 性病

Rails has_many STI

我试图在 rails 4 上实施 STI,但我无法让它工作,我搜索了很多结果但 none 工作。问题是:

我有一个实例 class,使用 STI 我有一个 subclass Car(一个虚拟 subclass)和 ScheduledInstance class.

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 

当试图获取任务的汽车或任务的预定实例时,它不起作用。(我在实例 table 上有一个类型列)

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 through 一起使用?

class Project < ActiveRecord::Base  
  has_many :tasks,      dependent: :destroy
  has_many :instances,  through: :tasks
end 

我有几个建议:

您是否尝试过将 belongs_to :task 添加到 CarScheduledInstance 模型中?这可能需要您还添加对数据库的引用。

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

您是否尝试加入查询?

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

我认为错误可能是由于文件命名造成的。你能确认你有:

# 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