ActiveRecord has_one和has_many关系相同:foreign_key

时间:2011-12-10 19:35:36

标签: ruby activerecord cancan has-many has-one

我有两个模型,StoryChapter。一个故事has_many章节,其中一章是第一章。我曾经在故事表中有一个外键start_id来指示哪个章节是第一个。 Hovewer,数据库模式必须稍微更改一下,现在每章都有一个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和协会进行授权。

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

1 个答案:

答案 0 :(得分:2)

依赖代码==' 1a'找到第一章有点不稳定。我可能会在章节表中添加一个标记,例如' first_chapter'或者是真或假的东西,表明它是否是第一章。这样一个章节的first_chapter-ness将在代码字段的更改后继续存在,但这有点挑剔。

另外,为了避免重复你自己,你可以改变has_one的声明:start to like like:

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