0

私は持っています

class Question < ActiveRecord::Base
   has_many :tasks, :as => :task
end

class QuestionPlayer < Question
end

class QuestionGame < Question
end

class Tast < ActiveRecord::Base
  belongs_to :task, :polymorphic => true
end

私がする時

Task.create :task => QuestionPlayer.new
#<Task id: 81, ... task_id: 92, task_type: "Question">

なぜ?task_type = "QuestionPlayer"でタスクを取得するにはどうすればよいですか?

4

1 に答える 1

0

その理由は、実際にはポリモーフィズムを使用しておらず、STI(単一テーブル継承)を使用しているためです。両方を定義および設定していますが、 STIのみを使用しています。

外部キーの目的は、定義したポリモーフィック外部キーでさえ、データベース内のテーブル内の別のレコードを参照することです。アクティブレコードには、レコードのテーブル名を持つ主キーとクラスが格納されている必要があります。これはまさにそれがしていることです。

たぶん、あなたが本当にやりたいのは、Questionオブジェクトごとに異なるクラスでSTIを使用することです。その場合、これを行います、

class CreateQuestionsAndTasks < ActiveRecord::Migration
  def self.up
    create_table :questions do |table|
      table.string :type
    end
    create_table :tasks do |table|
      table.integer :question_id
    end
  end
end
class Question < ActiveRecord::Base
  has_many :tasks
end
class QuestionPlayer < Question
end
class QuestionGame < Question
end
class Task < ActiveRecord::Base
  belongs_to :question
end

これで、想像どおりに機能します。

于 2012-05-14T10:24:36.367 に答える