【问题标题】:ActiveRecord has_one and has_many relation with the same :foreign_keyActiveRecord has_one 和 has_many 关系相同:foreign_key
【发布时间】:2011-12-10 19:35:35
【问题描述】:

我有两个模型,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 与关联授权)。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 哦,我不知道:through 不仅可以用于连接模型,还可以用于子集。那绝对更干净。
    • ...除了我重新创建开发数据库后 CanCan 突然停止工作。如果我恢复到更详细的关联,一切都很好。多么奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多