【发布时间】:2014-01-31 17:48:47
【问题描述】:
我有一个jobs 表和一个activities 表。一份工作可以有许多活动。关系是多态的。
表格:
job activities
----------- -------------
id id
... target_id
target_type
...
模型伪代码:
class Job < ActiveRecord::Base
# ...
has_many :activities, :as => :target, :dependent => :delete_all
# ...
end
class Activity < ActiveRecord::Base
# ...
belongs_to :target, :polymorphic => true
# ...
end
给定 Job 的状态由它关联的最后一个 Activity 的状态决定,如下所示(在这种情况下,最后一个是最后一个创建的,因此我们可以安全地按 id 排序)。
Job +-> Activity 1 - state: new |
+-> Activity 2 - state: submitted +--> Job state is approved
`-> Activity 3 - state: approved |
如何使用 ActiveRecord 和 Rails 3/4 仅查询处于给定状态的作业?
我还(只是)想到了一个想法,即使用“计数器缓存”之类的东西并非规范化关系,而不是完全执行此查询。我会将状态存储在作业表上并使用Activity 模型上的after_create 挂钩保持同步?类似这样的事情:
after_create :update_state
def update_state
target.update_attribute(state: self.state) if target.respond_to?(:state)
end
这是否是一种以更简单的方式解决问题的可行替代方案?
【问题讨论】:
-
我认为您已经有了最简单的解决方案。我会使用第二种方法,因为检查具有某些状态的作业需要很长时间。
标签: ruby-on-rails ruby-on-rails-3 activerecord