0

データベースに 2 つのテーブルがあり、両方に「updated_at」フィールドがあるとします。1 つのアクティブなレコード クエリで、両方のテーブルのすべてのレコードを取得したいと考えています。updated_at フィールドで並べられた 1 つの大きなアクティブ レコード リレーションを返す必要があります。これら 2 つのテーブルが非常に似ていると仮定します。

可能であれば、最初の 50 のみ、または 2 番目の 50 などを返す機能があるとよいでしょう。

これが例です

cats = Cat.all
dog = Dog.all

animals = (cats | dogs).sort!{|a,b| a.updated_at <=> b.updated_at}.limit(50)

すべての犬、次に猫を取得してから 1 つにマージし、最初の 50 匹の動物を取得するのはかなりコストがかかります。

db に対して 1 つのクエリを作成する方法が必要で、db は最初の 50 匹の動物を返します。または 2 番目の 50 匹の動物。

4

2 に答える 2

2

これらのモデルが非常に似ていることを考えると、ActiveRecord の単一テーブルの継承を使用する方がよいのではないでしょうか? あなたが提供した例では、基本クラス Animal があり、 Animal.order("updated_at").limit(50) だけで必要な結果が得られます

于 2012-12-11T21:29:15.090 に答える
0

これは単一のクエリではありませんが、明らかな最適化は、テーブル全体ではなく、それぞれの最初の50個のみを取得することです。

cats = Cat.order_by(:updated_at).limit(50)
dogs = Dog.order_by(:updated_at).limit(50)

animals = (cats + dogs).sort_by(&:updated_at).first(50)

次に、最後にクエリを実行して次の50を取得できますupdated_at

last_animal_date = animals.last.updated_a
next_cats = Cat.where("updated_at > ?", last_date).order_by(:updated_at).limit(50)
next_dogs = Dog.where("updated_at > ?", last_date).order_by(:updated_at).limit(50)
# etc ...

明らかに繰り返しの量で、これはメソッドに考慮に入れる必要がありますが、私はそれを読者の練習として残します:)

于 2013-01-25T00:47:06.090 に答える