0

我是 Rail 新手,正在尝试在 ActiveRecord 中进行查询。我正在尝试获取所有状态为“已登陆”的记录,这些记录已超过 60 天。我的查询一直到获得所有状态为“已登陆”的项目。当我添加“created_at < ?”的最后一个条件时,我总是得到一个空关系。我知道我有符合该描述的项目,所以我在查询中做错了什么并且不理解。我相信我的错误在于日期比较,但我不确定。

1. Projects
    belongs_to :status
    has_many :project_status_histories
2. Status
    has_many :projects
    has_many :project_status_histories
3. Project_Status_Histories
    belongs_to :status
    belongs_to :project

Project.find(:all, :joins => [:project_status_histories, :status], :conditions => {:projects => {:status_id => Status.where(:name => 'Landed').first.id }, :project_status_histories => {:created_at => ["created_at < ?", (Date.today - 60.days)]}})

我尝试使用 dbconsole 逐步构建查询,但没有任何运气。感谢您提前提供的所有帮助。

4

2 回答 2

4

我不认为这是日期算术。一种很好的方法是使用命名范围。将以下内容添加到 project.rb:

scope :landed, joins(:status).where('statuses.name' => 'Landed')
scope :recent, lambda \
              { joins(:project_status_histories) \
              .where('project_status_histories.created_at < ?', Date.today - 60.days) } 

然后您可以使用以下方法检索相关记录/对象:

Project.landed.recent

这在我的测试中对我有用。您还应该查看 Rails 指南,我从中窃取了大部分内容:

http://guides.rubyonrails.org/active_record_querying.html#scopes

于 2012-05-01T16:37:56.073 回答
0

您的查询有点复杂...

我宁愿这样做:

Project.where("status.name = ? AND project_status_histories.created_at < ?", "Landed", Time.now.day - 60.days)

我认为这应该会更好。如果没有,请告诉我,也许我写错了,不幸的是我现在无法测试它......

[编辑]

您可能还想查看生成的 SQL 是什么,为此使用“解释”方法,只需将其添加到查询的末尾并打印结果,例如使用您的查询:

Project.find(:all, :joins => [:project_status_histories, :status], :conditions => {:projects => {:status_id => Status.where(:name => 'Landed').first.id }, :project_status_histories => {:created_at => ["created_at < ?", (Date.today - 60.days)]}}).explain
于 2012-05-01T09:55:52.483 回答