Ruby ActiveRecord与相同的外键有一个或多个关系

Ruby ActiveRecord与相同的外键有一个或多个关系,ruby,activerecord,cancan,has-many,has-one,Ruby,Activerecord,Cancan,Has Many,Has One,我有两个模型,故事和章节。一个故事有许多章节,其中一章是作为第一章的章节。我以前在故事表中有一个外键start\u id,用来指示哪一章是第一章。Howewer,数据库模式必须稍微更改,现在每章都有一个code。如果代码是'1a',那么这就是拥有该章节的故事的第一章 以下内容似乎有效,包括#create_start: has_many :chapters, :dependent => :destroy, :inverse_of => :story has_one :start, :c

我有两个模型,
故事
章节
。一个故事有许多章节,其中一章是作为第一章的章节。我以前在故事表中有一个外键
start\u id
,用来指示哪一章是第一章。Howewer,数据库模式必须稍微更改,现在每章都有一个
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'}
这样,就不需要stories表的外键
start\u id
,并且
#start
仍然是一个关联,具有所有好处(我需要
#start
作为一个关联,因为我使用关联进行授权)


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

依靠代码=='1a'查找第一章有点不可靠。我可能会在Chaptes表中添加一个标志,如“first_chapter”或是一些正确或错误的标志,指示它是否是第一章。这样,章节的第一章就可以在代码字段发生更改后继续存在,但这有点挑剔

此外,为了避免重复,您可以将has_one:start的声明更改为类似以下内容:

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

哦,我不知道
:通过
不仅可以用于连接模型,还可以用于子集。这肯定更干净了……除了在我重新创建开发数据库后CanCan突然停止工作。如果我回到更详细的关联,一切又会好起来。真奇怪。