【问题标题】:Rails - Complicated SQL QueryRails - 复杂的 SQL 查询
【发布时间】:2013-01-12 23:50:43
【问题描述】:

我需要有关执行以下查询的帮助:

  1. 从最新的记录开始,向下到较旧的记录。
  2. 需要按created_at时间排序。
  3. 如果在 created_at 时间数据库中有新记录,则检索它们,但不要获取我从步骤 1 中获得的记录。
  4. 我只想一次只获取 16 条记录。这个数字以后可能会改变。
  5. 不要检索我之前发送的记录。

也只是为了让您知道,这是通过 $.ajax 启动的。

这样做的原因是因为我正在将新旧记录实时发送给客户。想想像用户开始访问网站并从新记录开始获取当前记录。然后用户可以去获取较旧的记录,但在同样的请求中,它也会检索全新的记录。一次只有 16 条记录。

我说得通吗?

这是我目前拥有的代码:

RssEntry.includes(:RssItem).where("rss_items.rss_id in (?) AND (rss_entries.id < ? OR rss_entries.created_at > ?)", rssids, lid, time).order("rss_entries.id DESC").limit(16)

lid = last lowest id from those records
rssids = ids from where to get the records
time = last time it did the records call

上面的代码只是开始。我现在需要帮助以确保它符合我的上述要求。

更新 1

好的,所以我设法做了我想做的事,但只用了 2 个 sql 查询。我真的认为不可能在一个 sql 查询中做我想做的事。

非常感谢任何帮助。

谢谢。

【问题讨论】:

  • 是否可以在一个 sql 查询中满足我的要求?还是我必须在两个查询中完成?

标签: sql ruby-on-rails ruby-on-rails-3


【解决方案1】:

首先,使用作用域得到你想要的:

class RssEntry < ActiveRecord::Base
  scope :with_items, includes(:RssItem)
  scope :newer_first, order("rss_entries.created_at DESC")

  def self.in(args)
    where(id: args)
  end

  def self.since(time)
    where('rss_entries.created_at > ?', time)
  end
end

然后

RssEntry.with_items.in(rssids).since(time).offset(lid).limit(16).newer_first

它应该按预期工作。

【讨论】:

  • 当我这样做时,我得到以下错误: undefined method `in' for #<:relation:0x007f8a3d5740a8>
  • 我相信这些应该被定义为类方法(即def self.in(args)def self.from(time)
  • 好的,我在函数中添加了self.in和self.from。现在我收到这个错误: SQLite3::SQLException: near "0": syntax error: SELECT "rss_entries".* FROM 0 WHERE "rss_entries"."id" IN (3, 4) ORDER BY rss_entries.created_at DESC LIMIT 16偏移量 0
  • 那个错误好像不是选择数据库,而是0?为什么它从上面的代码中这样做。
  • 好的,所以我将函数 self.from 更改为 self.timeCheck 现在它正在正确选择数据库,但是还有另一个问题。它没有按预期工作。它在第一次运行时给了我结果,但是在参数 lid 不是 0 之后,它就不起作用了。
猜你喜欢
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多