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