これらの2つのコードは、それぞれMicropostモデル内のリレーションを返します。
scope :including_replies, lambda { |user| where("microposts.in_reply_to = ?", user.id)}
def self.from_users_followed_by(user)
followed_user_ids = user.followed_user_ids
where("user_id IN (?) OR user_id = ?", followed_user_ids, user)
end
実行するr1 = Micropost.including_replies(user)
と、次のSQLで2つの結果との関係が得られます。
SELECT `microposts`.* FROM `microposts` WHERE (microposts.in_reply_to = 102) ORDER BY
microposts.created_at DESC
実行するr2 = Micropost.from_users_followed_by(user)
と、次のSQLで1つの結果との関係が得られます。
SELECT `microposts`.* FROM `microposts` WHERE (user_id IN (NULL) OR user_id = 102) ORDER
BY microposts.created_at DESC
このように関係をマージすると、r3 = r1.merge(r2)
結果はゼロになりましたが、3つを期待していました。これは、SQLが次のようになっているためです。
SELECT `microposts`.* FROM `microposts` WHERE (microposts.in_reply_to = 102) AND
(user_id IN (NULL) OR user_id = 102) ORDER BY microposts.created_at DESC
今私が必要としているのは、マージされた関係の代わり(microposts.in_reply_to = 102) OR (user_id IN (NULL) OR user_id = 102)
に必要なことです。OR
AND
これを行う方法はありますか?