[英]How to implement complex SQL queries in Ruby on Rails?
我有四個表:“ users
”,“ user_groups
”,“ groups
”,“ categories
”。 “ users
”和“ groups
”是通過“ user_groups
”的many_to_many
關系。 “ groups
”和“ categories
”是many_to_one
關系。
我創建了以下 SQL 查詢,但我不確定如何在 Ruby on Rails 中實現它:
SELECT u.*
FROM users u
WHERE EXISTS (SELECT 1
FROM user_groups ug,
groups g,
categories c
WHERE u.id = ug.user_id
AND ug.group_id = g.id
AND g.category_id = c.id
AND c.id in ('1, 2, 3'))
在 Ruby on Rails 中不使用原始 SQL 實現它的最佳方法是什么?
我不喜歡總是將復雜的查詢翻譯成 ActiveRecord 查詢語言。 相反,我認為用普通 SQL 編寫復雜查詢完全沒問題,因為 SQL 通常更容易編寫和理解。
也就是說,我認為這可能有效:
User.where(
id: UserGroup.select('user_groups.user_id')
.joins(groups: :categories)
.where(categories: { id: [1, 2, 3] })
)
這可能比您想象的要簡單得多:
class User
has_many :user_groups
has_many :groups, through: :user_groups
end
class Group
has_many :user_groups
has_many :users, through: :user_groups
belongs_to :category
end
User.joins(:groups)
.where(groups: { category_id: [1,2,3] })
ActiveRecord 將處理加入中間表。
由於這是左內連接,因此忽略連接表中沒有匹配項的任何行。 無需在存在的地方做WHERE EXISTS ...
這將為您提供屬於至少一個類別為 1、2 或 3 的組的用戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.