Ruby on rails Rails--根据定义的属性选择记录

Ruby on rails Rails--根据定义的属性选择记录,ruby-on-rails,records,Ruby On Rails,Records,我想根据定义的属性为模型选择记录 我有一个摘要模型。摘要有许多状态。(我想记录每个状态更改以维护状态更改历史记录和每个状态更改的一些元数据。)每个状态都有一个代码属性 每个摘要都有一个定义的属性:currentstatus(self.Statuses.last.code)。我想选择currentstatus==1的所有摘要。因为它是一个已定义的属性,所以我不能使用Dockets.where(:currentstatus=>1) 提前感谢您的帮助。试试这个: Docket.joins(:statu

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

我有一个摘要模型。摘要有许多状态。(我想记录每个状态更改以维护状态更改历史记录和每个状态更改的一些元数据。)每个状态都有一个代码属性

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

提前感谢您的帮助。

试试这个:

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)")

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

a) 加载所有内容并在内存中过滤(不要这样做!)

b) 将
current\u status
方法中的逻辑转换为SQL查询,并在
current\u status
方法和
search\u中复制逻辑以查找当前\u status
方法

c) 复制数据(这意味着,当当前_状态更改时,您可以在摘要上设置一个标志,然后使用
where
进行查询)

>如果CurrnEnStand方法是简单的(可以在这样的文档模型中定义一个范围方法)

,千万不要做-B。
类摘要

c基本上只是为了查询目的对数据进行去规范化。您可以将其放入原始模型中,也可以创建一个特殊的表(您甚至可以通过cron作业或其他触发器自动刷新该表-可能是在
状态下保存回调后的ActiveRecord
模型)

您可以在docket.rb中使用名为的范围

named_scope :find_by_currentstatus, lambda {|currentstatus| 
  {:conditions => {:currentstatus => 1}}
}

您可以尝试sql方法

Docket.where('(SELECT statuses.currentstatus FROM statuses WHERE statuses.docket_id = dockets.id ORDER BY statuses.created_at DESC LIMIT 1) = ?', 1)

currentstatus是摘要的属性:)
Docket.where('(SELECT statuses.currentstatus FROM statuses WHERE statuses.docket_id = dockets.id ORDER BY statuses.created_at DESC LIMIT 1) = ?', 1)