2011-12-10 70 views
2

我有两个模型,StoryChapter。一个故事has_many章节,其中之一是作为其第一章的章节。我曾经在故事表中使用外键start_id来指示哪一章是第一个。 Hovewer,数据库模式必须改变一点,现在每章都有一个code。如果代码是'1a',那么这是故事的第一章,它拥有该章节。ActiveRecord has_one和has_many的关系相同:foreign_key

以下似乎工作,包括#create_start

has_many :chapters, :dependent => :destroy, :inverse_of => :story 
has_one :start, :class_name => 'Chapter', :foreign_key => 'story_id', :conditions => {:code => '1a'} 

这样,故事,表是不必要的外键start_id#start仍然是一个协会,所有的好处(我需要#start为一个关联,因为我使用CanCan和关联进行授权)。

我的方法有什么缺点,我现在还没有意识到,或者我对它比较安全?

回答

2

依靠代码=='1a'来找到第一章有点过分。我可能会在章表中添加一个标志,如'first_chapter'或者是否为真或假,表明它是否是第一章。这样一章的第一章就会在代码字段的变化中生存下来,但这有些挑剔。

另外,为了避免重复自己,你可以改变HAS_ONE声明:开始是这样的:

has_one :start, :through => :chapters, :conditions => { :code => '1a' } 
+0

哦,我不知道':through'可不仅用于连接模型,也包括子集。这绝对是更清洁。 –

+0

...除了CanCan在重新创建我的开发数据库后突然停止工作。如果我恢复到更加冗长的关联,那么这又很好。多么奇怪。 –

相关问题