2

それでは、行きましょう。私は Activerecord::Base モデルを持っています。それを人間と呼びましょう。

class human < ActiveRecord::Base
   has_one :Animal
end

動物は抽象クラスです -

class animal < ActiveRecord::Base
   self.abstract_class = true;
 end

そして私は動物のサブクラスを持っています、それを犬にしましょう

class dog < Animal

抽象クラスを使用しない場合、インスタンス変数を「犬」に追加できません (「動物」テーブルに格納されるため)。抽象クラスを使用する場合、'Animal' を 'Human' に追加できません。レールは、たとえば 'Dog' (ActiveRecord エラー: could't find table '') の保存方法を知らないためです。 . この状況は私を夢中にさせます、そして私はそれを乗り越えることができません. 私は何かを見逃していますか、それとも完全に間違っていますか?

4

3 に答える 3

2

Ruby の慣習により、Animal はクラスを参照します (実際にはもう少し複雑です。このリンクには詳細があります)。元の投稿では、「犬のクラス」は「犬のクラス」である必要があります。クラス名は定数であり、人間と動物の間に has_one の関連付けがある場合は、 human.animal = (動物のいくつかのインスタンス) と言うことができます。 、しかし human.Animal は、すぐにクラッシュしないと奇妙な影響を与える可能性があります。他の人が推奨している STI アプローチは、'Animal' ではなく 'type' 値を設定しますが、まさにあなたが望むことを行います (実際には直接これを行わないでください)。

Ruby と RoR、STI、アクティブ レコード アソシエーション、およびポリモーフィック アソシエーションにおける大文字の意味についてよく読んでください。このようなものは機能するはずです (テストされておらず、正規化が悪いです。has_one 関連付けと委任と呼ばれるパターンを使用して、一般的な動物の特性が 1 つのテーブルにあり、「人間固有の」特性が別のテーブルにある状況を設定して、データベース内の NULL 列の束):

# remember to set up your migrations to add a 'type' column to your Animal table
# if animals can own other animals who own other animals, you may want to look at
# acts_as_tree, which does trees in relational databases efficiently 

class Animal < ActiveRecord::Base 
  self.abstract_class = true
end

class Dog < Animal
  # this is bad normalization - but you can keep this simple by adding 
  # a human_id field in your animal table (don't forget to index)
  # look into the 'belongs_to' / 'references' type available for DB migrations   
  belongs_to :human
end

class Human < Animal
  has_one :dog, :autosave => true # or you could use 'has_many :dogs' 
end

human = Human.new # => adds record to Animal table, with type = 'human'
dog = Dog.new
human.dog = dog
human.save
于 2013-11-03T07:34:45.587 に答える
1

ActiveRecordにはポリモーフィックアソシエーションのサポートが組み込まれているため、次のことができます。

http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

于 2012-08-21T15:51:36.107 に答える