2010-05-23 23 views
0

我需要在应用程序中为所有者和受托人建模,因此您拥有的内容始终由某人拥有,并且可以为其他人出租。我首先用单表继承来解决这个问题,因为这两种类型的人将共享所有的属性,所以你将有一个名为Person的模型关联到拥有Owner和Rentee继承自Person的表的人。Rails - 子类型可以扮演两种角色的类的继承层次结构

问题是单类型继承使用字段类型来识别子类型,因此表中的记录可以表示一个所有者或一个Rentee,但不能同时代表两个,而在真正的上下文中,您可以拥有一个所有者这是从另一个所有者租用的东西,因此该人同时是一个所有者和一个Rentee。

你会如何解决这个问题?你会为业主和人员使用分开的表吗? Rails中有没有其他类型的表继承?

回答

1

我建议你保持简单。你可以租用和拥有物品的人 - 同样的人物,相同的物品 - 只是添加一种方式来跟踪谁拥有和物品以及谁租用它。

你可以做这样的事情:

class Person 
    has_many :items 
    has_many :rented_items, :class_name => "Item", :foreign_key => "rentee_id" 
end 

class Item 
    belongs_to :person 
    belongs_to :rentee, :class_name => "Person", :foreign_key => "rentee_id" 
end 

# so you have: 
person.items # all the items a person owns 
person.rented_items # all the items he has rented 
+0

这是一个很好的做法,简单是一件好事。但是,如何有效地获得所有业主名单和所有人员名单? – Miquel 2010-05-23 15:11:53

+0

您可以使用:group选项(group by person_id)从Item表中获取所有所有者ID的列表,然后从Person表中获取这些记录。其他选项(可能更好)是使用belongs_to counter_cache选项并缓存每个人的租用/拥有项目的数量。然后,您可以轻松获得所有受托人和所有者(例如,Person.find(:conditions =>'items_count> 0'))。 – 2010-05-23 19:49:11