簡體   English   中英

如何在 Ruby on Rails 中實現復雜的 SQL 查詢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM