2010-11-13 107 views
1

我有以下情形,我不知道我是否应该使用类继承或单表继承:类继承或单表继承2.3

Class User 
    has_one :main_list 
    has_one :known_list 
    has_many :regular_lists 
end 

Class List 
    has_many :words 
end 

Class Word 
    belongs_to :list 
end 

我希望做的是让每个不同的列表类型是不同的类,问题是如果我这样做,我需要将main_list_id,known_list_idregular_list_id添加到Word对象/类。这看起来很麻烦。我可以这样做:

Class MainList 
    has_many :words, :foreign_key => list_id 
end 

,然后是这样的:

@user.main_list.find_by_name("MainList")

唯一的问题是,有人可以命名RegularList“MainList”。

回答

1

你可以做这样的事情:

Class User < ActiveRecord::Base 
    has_many :lists 
end 

Class List < ActiveRecord::Base 
    belongs_to :user 
    has_and_belongs_to_many :words 
end 

Class Word < ActiveRecord::Base 
    has_and_belongs_to_many :lists 
end 

在列表类,你可以添加两个布尔字段列表;一个用于main_list,另一个用于known_list。在该类上,您还可以添加验证,以确保每个用户只有一个主列表和一个已知列表。要为用户选择主要列表,你可以这样做:

@user.lists.find(:first, :conditions => {:main_list => true}) 
+0

有趣的想法,但现在做@ user.regular_lists呢?是不是会返回所有列表,包括main_list和known_list?这些布尔字段的索引是否合适? – TenJack 2010-11-14 00:22:20

+0

要找到这些,它会是@ user.lists.find(:first,:conditions => {:main_list => false,:known_list => false})。您还可以通过创建命名范围来简化此操作。不,不建议索引布尔字段...只需索引user_id。 – 2010-11-14 00:32:55

+0

上面的编辑:查询应该是@ user.lists.find(:all,:conditions => {:main_list => false,:known_list => false}),因为有多个常规列表...对不起。 – 2010-11-14 02:57:01