私のアプリでは、私のモデルはとSinatra
の間の HABTM 関係を定義します。私はいくつかのスコープを定義しようとしています。1 つはno に関連付けられたすべてのもので、もう 1 つは特定の.Users
Notifications
Notifications
Users
unread
Notifications
User
class Notification < ActiveRecord::Base
has_and_belongs_to_many :users
scope :unread, ->{
Notification.joins("LEFT JOIN notifications_users ON notifications.id = notifications_users.notification_id").
where("notifications_users.user_id IS NULL").uniq
}
scope :unread_by, ->(u){
Notification.joins("LEFT JOIN notifications_users ON notifications.id = notifications_users.notification_id").
where("notifications_users.user_id <> ?", u.id).uniq
}
スコープはunread
正常に機能しますが、unread_by
スコープは期待した結果をもたらしません。
it "should know which notifications have not yet been read by anyone, or by a particular user" do
n1 = Notification.create!(title: 'test 1', text: 'this is some longer text about the notification')
n2 = Notification.create!(title: 'test 2', text: 'this is also some longer text about the notification')
Notification.unread.must_include(n1)
Notification.unread.must_include(n2)
@user1.read(n1)
Notification.unread.wont_include(n1)
Notification.unread.must_include(n2)
Notification.unread_by(@user1).wont_include(n1)
Notification.unread_by(@user1).must_include(n2) # => fails
Notification.unread_by(@user2).must_include(n1)
Notification.unread_by(@user2).must_include(n2) # => fails
end
クエリ ロジックに欠陥があると思われますが、これを長時間見つめていて、表示されていません。私は何が欠けていますか?