0

我想根据定义的属性为模型选择记录。

我有一个 Docket 模型。案卷有许多状态。(我想记录每个状态变化,以维护状态变化历史和每次状态变化的一些元数据。)每个状态都有一个代码属性。

每个 Docket 都有一个定义的属性:currentstatus (self.Statuses.last.code)。我想选择所有具有 currentstatus == 1 的 Docket。因为它是一个已定义的属性,所以我不能使用 Dockets.where(:currentstatus => 1)。

提前感谢您的帮助。

4

4 回答 4

1

你可以试试sql方法

Docket.where('(SELECT statuses.currentstatus FROM statuses WHERE statuses.docket_id = dockets.id ORDER BY statuses.created_at DESC LIMIT 1) = ?', 1)
于 2013-02-12T13:46:56.783 回答
1

您可以在docket.rb中使用 named_scope:

named_scope :find_by_currentstatus, lambda {|currentstatus| 
  {:conditions => {:currentstatus => 1}}
}
于 2013-02-12T13:34:53.177 回答
0

尝试这个:

Docket.joins(:statuses).where("statuses.currentstatus = 1")

更新

尝试以下操作:

Docket.includes(:statuses).where("(statuses.id = (select max(statuses2.id) from statuses statuses2 where statuses2.docket_id = dockets.id)) AND (statuses.currenstatus = 1)")
于 2013-02-12T13:21:46.947 回答
0

这是一个棘手的问题,因为您只有两个非常丑陋的选择,一个有点笨拙:

a)加载所有内容并将其过滤到内存中(不要那样做!)

b) 将方法中的逻辑current_status转换为 SQL 查询,并在current_status方法和search_for_current_status方法中复制逻辑。

c) 复制数据(意思是,当 current_status 更改时,您在 Docket 上设置一个标志,然后您可以使用where.

永远不要做 a - 如果 current_status 方法很简单,请考虑 b(你可以像这样在 Docket 模型的范围方法中定义它)

class Docket < ActiveRecord::Base
  def self.open
    # so some magic here with joins on the statuses table
  end
end

c 基本上只是出于查询目的对数据进行非规范化。您可以将其放入原始模型中,或者您可以创建一个特殊表(您甚至可以通过 cron-job 或其他触发器自动刷新该表 - 可能是Status模型中的 ActiveRecord after_save 回调)

于 2013-02-12T13:22:00.557 回答