2

我有两个模型,StoryChapter。一个故事has_many章节,其中一个是作为其第一章的章节。我曾经在 stories 表中有一个外键start_id来指示哪一章是第一章。然而,数据库模式不得不稍微改变一下,现在每章都有一个code. 如果代码是'1a',那么这是拥有该章节的故事的第一章。

以下似乎有效,包括#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和关联进行授权)。

我的方法是否有任何我目前没有意识到的缺点,或者我对它相对安全?

4

1 回答 1

2

靠代码 == '1a' 找到第一章有点不靠谱。我可能会在章节表中添加一个标志,例如“first_chapter”或者是真还是假的东西,表明它是否是第一章。这样一章的 first_chapter-ness 将在代码字段的更改中保留下来,但这有点挑剔。

此外,为避免重复自己,您可以将 has_one :start 的声明更改为:

has_one :start, :through => :chapters, :conditions => { :code => '1a' }
于 2011-12-10T20:26:06.937 回答