按照 Ruby 中的约定,Animal 将引用一个类(实际上,它涉及更多一些 - 这个链接有更多详细信息)。在你原来的帖子中,“class dog”应该是“class Dog”b/c,类名是一个常量,如果你在人和动物之间有一个has_one关联,你可以说human.animal =(一些动物实例) ,但是 human.Animal 如果不立即崩溃,可能会产生奇怪的效果。其他人推荐的 STI 方法将完全按照您的意愿进行,尽管您将设置“类型”值,而不是“动物”(请不要直接这样做)。
您应该阅读 Ruby 和 RoR、STI、活动记录关联和多态关联中大写的含义。像这样的东西应该可以工作(未经测试,而且标准化不好 - 您可以使用 has_one 关联和一种称为委托的模式来设置通用动物特征在一个表中,而“人类特定”特征在另一个表中以避免数据库中的一堆 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