我有一个模特:
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_one
与belongs_to
相反,即在对方中寻找密钥而不是调用模型。
如果Rails没有提供创建这种性质的关联的方法,那么最Railsy解决方案是什么?
答案 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
方法。