2016-07-08 3 views
1
class User < ActiveRecord::Base 
has_many :user_notifications 
end 


class UserNotification < ActiveRecord::Base 
    belongs_to :user 
end 

Я пытаюсь найти всех пользователей, у которых нет есть записи о пользователе. Можно ли это сделать с помощью областей?Как я могу написать области, которые извлекают всех пользователей, у которых нет каких-либо user_notifications?

ответ

1

Мне нравится версия разработчика033, но я думаю, что вам нужно использовать синтаксис хеша в where:

scope :without_notificatons, lambda { 
    eager_load(:user_notifications).where(user_notifications: { user_id: nil }) 
} 

Когда вы уже на Rails 5, вы можете использовать left_outer_joins, что немного читаемо и explizit.

scope :without_notificatons, lambda { 
    left_outer_joins(:user_notifications).where(user_notifications: { user_id: nil }) 
} 
+0

Спасибо @spickermann да Синтаксис хэша верен, но не могли бы вы рассказать мне, что такое основное отличие b/w, используя eager_load и используя {joins ("LEFT OUTER JOIN user_notifications ON users.id = user_notifications.user_id") ответ sampat – Prem

+0

'eager_load' заставляет «LEFT OUTER JOIN» позади, вы просто печатаете меньше. Мне нравится это объяснение: http://blog.arkency.com/2013/12/rails4-preloading/ – developer033

1

У меня нет ни одного проекта в моем фронте, но так как я помню, вы можете просто сделать следующее:

scope :filtered_users, -> { eager_load(:user_notifications).where(user_notifications.user_id: nil) } 
1

, используя SQL в вашем заявлении где:

scope :no_notifications, -> {includes(:user_notifications).where('NOT EXISTS(select * from user_notifications where user_notifications.user_id = users.id)')} 
1
class User < ActiveRecord::Base 
has_many :user_notifications 
scope :without_notifications, -> { joins("LEFT OUTER JOIN user_notifications ON users.id = user_notifications.user_id").where(user_notifications.id: nil) } 
end 
+0

Это тот же самый ответ, что и мой ... разница в том, что я написал ('eager_load'), который также выполняет« ВЛЕВОЙ ВЗАИМОДЕЙСТВУЮЩИЙ ». – developer033

Смежные вопросы