我有一个工作解决方案,这个管道绑在一起,但它依赖于一些非常讨厌的查询,我担心这将使应用程序相当脆弱。寻求有关如何更好地实施以下内容的建议。
我有Child,ChildStatus和StatusValue的模型。 StatusValue具有“活动”标志。我想使用此活动状态来过滤我从数据库中拉出子项的大部分时间(沿着软删除的行)。
下面的Child模型在处理单个实例时效果非常好。但是,汇总数据会变得混乱(至少我已经这么做了)。
class Child < ActiveRecord::Base
...
has_many :child_statuses
has_many :status_values, :through => :child_statuses
...
def current_status
child_statuses.last
end
def status_name
if current_status
current_status.status_value.name
else
"n/a"
end
end
def status_active
current_status && current_status.status_value.active
end
end
class ChildStatus < ActiveRecord::Base
belongs_to :child
belongs_to :status_value, :foreign_key => :status_id
end
class StatusValue < ActiveRecord::Base
has_many :child_statuses
end
有了上述内容,当我想查询处于活动状态的子进程的查询时,我最终得到一个带有...AND child_statuses.created_at = (SELECT MAX(created_at) FROM child_statuses WHERE child_id = children.id)
我觉得我正在回到我的SQL舒适区,但可能有更好的方法来做到这一点。
我不应该做Child.where(:status_value.active => "TRUE")
之类的事吗? (这会引发错误 - 未定义的方法'active'为:status_value:Symbol)
非常感谢任何指导。我曾考虑过探索一个数据库视图来使其工作,但我不相信它会有所帮助。
答案 0 :(得分:3)
您可以创建数据库视图(在迁移中使用execute "CREATE VIEW my_view AS..."
)并将ActiveRecord模型指向它而不是表格。
class MyView < ActiveRecord::Base
def readonly?
true
end
end
答案 1 :(得分:0)
你试过Child.includes(:status_values).where('status_values.active = true')
吗?
免责声明:我不清楚Child.joins()
和Child.includes()
之间的区别。