在rails中使用等效的数据库视图的最佳方法?

时间:2011-08-03 00:37:17

标签: ruby-on-rails

我有一个工作解决方案,这个管道绑在一起,但它依赖于一些非常讨厌的查询,我担心这将使应用程序相当脆弱。寻求有关如何更好地实施以下内容的建议。

我有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查询

我觉得我正在回到我的SQL舒适区,但可能有更好的方法来做到这一点。

我不应该做Child.where(:status_value.active => "TRUE")之类的事吗? (这会引发错误 - 未定义的方法'active'为:status_value:Symbol)

非常感谢任何指导。我曾考虑过探索一个数据库视图来使其工作,但我不相信它会有所帮助。

2 个答案:

答案 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()之间的区别。