建模has_one" active" has_many children

时间:2018-05-22 13:39:33

标签: ruby database ruby-on-rails-3 activerecord

我有一个模特:

class Group < ActiveRecord::Base
  has_many :progressions
  has_one :active_progression, class_name: "Progression"
end

孩子:

class Progression < ActiveRecord::Base
  belongs_to :group
end

我知道惯例说我应该在Progression内创建一个单独的外键,以将活动进度与组的ID相关联(因为这就是has_one的工作方式)。

然而,恕我直言,存储“活跃”的更合乎逻辑的意义。儿童在群组模型中的身份。

编辑:原因是将进程模型中的组ID存储为active_group_id或类似的东西在语义上是混乱的,并且开启了与组关联的多个活动进程的可能性,这显然是不正确的。

编辑2:此外,进度应该能够成为多个组的主动进展。创建一个额外的连接表似乎是多余的,只要我能够拥有“活跃的”#39;孩子的id存储在Group模型中。

我已经阅读了几篇帖子,其中人们混淆了基础的has_one含义,假设它与belongs_to做同样的事情,但对于父母来说。我知道事实并非如此。 has_onebelongs_to相反,即在对方中寻找密钥而不是调用模型。

如果Rails没有提供创建这种性质的关联的方法,那么最Railsy解决方案是什么?

1 个答案:

答案 0 :(得分:0)

一个选项可能是Group上的方法,例如:

def active_progression
  progressions.all.find { |p| p.id == active_progress_id }
end

使用方法的优点是,如果您通常循环遍历所有进度,则只需进行一次SQL调用。该方法从现有记录集中查找活动进度。

请注意,这是使用Ruby #find方法(https://ruby-doc.org/core-2.2.3/Enumerable.html#method-i-find)而不是ActiveRecord #find方法。