1

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

  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 查询中做我想做的事。

任何帮助是极大的赞赏。

谢谢。

4

1 回答 1

3

首先,使用范围来获得你想要的:

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

它应该按预期工作。

于 2013-01-13T01:13:04.760 回答