1

次のことを行うクエリについてサポートが必要です。

  1. 最新のレコードから開始し、古いレコードに向かって下に移動します。
  2. created_at 時間で注文する必要があります。
  3. created_at 時間までにデータベースに新しいレコードがある場合は、それらを取得しますが、ステップ 1 で既に取得したレコードは取得しません。
  4. 一度に 16 レコードだけを取得したい。その数は後で変更できます。
  5. 以前に送信したレコードを取得しないでください。

また、これは $.ajax を介して開始されます。

この理由は、クライアントに送信される新しいレコードと古いレコードをリアルタイムで取得しているためです。ユーザーが Web サイトにアクセスし始め、新しいレコードから現在のレコードを取得するようなものだと考えてください。その後、ユーザーは古いレコードを取得できますが、同じ要求で新しいレコードも取得します。一度にわずか 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クエリでやりたいことができました。1つの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 に答える