2

レール4にSTIを実装しようとしましたが、動作させることができません。多くの検索結果を検索しましたが、何も機能しませんでした。ここに問題があります:Rails has_many STI

私はSTIを使ってインスタンスクラスを持っています。サブクラスCar(ダミーサブクラス)とScheduledInstanceクラスがあります。

タスクの車やタスクのscheduledinstancesを取得しようと、それは動作しません
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を実行するとOKです。私は何が欠けているのですか?

回答に基づいて、has_many throughで動作させるためにはどのような変更を適用する必要がありますか?

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

私はbelongs_toの追加だけでタイトル –

答えて

2

私はこのエラーがファイルの命名によるものだと考えています。あなたが持っていることを確認することができます:あなたのtask.rbで次に

# models/car.rb 
class Car < Instance 
end 

# models/scheduled_instance.rb 
class ScheduledInstance < Instance 
end 

は、あなたが持っている必要があります。

class Task < ActiveRecord::Base 
    has_many :instances,   dependent: :destroy 
    has_many :cars 
    has_many :scheduled_instances 
end 
+0

それは働いた!私はそれらを同じファイルに入れることができると思った。ありがとう:D – Gaston

0

私は提案のカップルを持っている:

あなたはCarScheduledInstanceモデルにbelongs_to :taskを追加しようとしたことがありますか?これには、DBへの参照も追加する必要があります。

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

OR

クエリに参加しようとしたことがありますか?

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

用に投票しなければならなかった:カーモデルにタスクをdoesnの仕事はありません。それはすでに(相続によって)それを持っていませんでしたか? 2番目のアイデアは私にこれを与えます: NameError:初期化されていない定数Task :: Scheduledinstance – Gaston

+0

'Task.joins(:instances).first.cars'はどうでしょうか? – Okomikeruko