[解決済み] ActiveRecord クエリユニオン
2022-12-01 09:30:53
質問
Ruby on Railのクエリインターフェイスを使って、(少なくとも私にとっては)複雑なクエリをいくつか書きました。
watched_news_posts = Post.joins(:news => :watched).where(:watched => {:user_id => id})
watched_topic_posts = Post.joins(:post_topic_relationships => {:topic => :watched}).where(:watched => {:user_id => id})
これらのクエリは両方ともそれ自体で問題なく動作します。 どちらもPostオブジェクトを返します。 これらの投稿を1つのActiveRelationにまとめたいと思います。 何十万もの投稿がある可能性があるので、これはデータベースレベルで行う必要があります。 MySQLのクエリであれば、単純に
UNION
演算子を使うことができます。 RoRのクエリインターフェイスで同じようなことができるかどうか、誰か知っていますか?
どのように解決するのですか?
複数のスコープをUNIONするための、私が書いた簡単なモジュールを紹介します。 また、結果はActiveRecord::Relationのインスタンスとして返されます。
module ActiveRecord::UnionScope
def self.included(base)
base.send :extend, ClassMethods
end
module ClassMethods
def union_scope(*scopes)
id_column = "#{table_name}.id"
sub_query = scopes.map { |s| s.select(id_column).to_sql }.join(" UNION ")
where "#{id_column} IN (#{sub_query})"
end
end
end
以下はその要点です。 https://gist.github.com/tlowrimore/5162327
編集する
リクエストにお応えして、UnionScopeの動作例をご紹介します。
class Property < ActiveRecord::Base
include ActiveRecord::UnionScope
# some silly, contrived scopes
scope :active_nearby, -> { where(active: true).where('distance <= 25') }
scope :inactive_distant, -> { where(active: false).where('distance >= 200') }
# A union of the aforementioned scopes
scope :active_near_and_inactive_distant, -> { union_scope(active_nearby, inactive_distant) }
end
関連
-
[解決済み】bundle installが "Could not locate Gemfile "を返す。
-
[解決済み] Mac OS Xにhomebrewがインストールされているかどうかを確認する方法
-
[解決済み] Ruby: public static メソッドを作るには?
-
[解決済み] rails consoleを起動するとRailsのイニシャライザーが呼ばれる?
-
[解決済み] Heroku Error R14 (Memory quota exceeded): How do I solve this?
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] Railsです。ActiveRecordでデフォルト値を設定するにはどうすればよいですか?
-
[解決済み】空のActiveRecordリレーションを返すには?
-
[解決済み】ActiveRecordのオブジェクトが新しいかどうかを判断する
-
[解決済み] ActiveRecordのORクエリ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Bundler: コマンドが見つからない
-
[解決済み] 新規ユーザー作成時に ActiveModel::ForbiddenAttributesError が発生する。
-
[解決済み] Rails のインストールに失敗する: activesupport には Ruby のバージョン >= 2.2.2 が必要です。
-
[解決済み] Rubyで変数をインクリメントする [重複]。
-
[解決済み] Paramが無いか、値が空である。ParameterMissing in ResultsController#update
-
[解決済み] 検索 vs 発見する by vs どこに
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜ?
-
[解決済み] RoRにおけるSpringサーバーの機能とは?
-
[解決済み] "render :nothing => true" は空のプレーンテキストファイルを返すのですか?
-
[解決済み] 2つのActiveRecord::Relationオブジェクトを結合する