簡體   English   中英

Rails 中的內部連接 options_from_collection_for_select

[英]Inner Join in Rails options_from_collection_for_select

我在下面創建了連接查詢來獲取組名詳細信息。我在 postgresql 中使用下面的查詢。

select DISTINCT e.group_id,e.groupname from user_group_table u, execution_groups e where (u.user_id=e.user_id or u.group_id=e.group_id) and u.user_id=12;

如何在 Rails 中使用“options_from_collection_for_select”編寫上述連接查詢?

我試過下面的代碼

user_groups = UserGroupTable.where(:user_id => id)

@execution_group_options =  ExecutionGroup.where(user_id: user_groups.select(:user_id)).or(ExecutionGroup.where(group_id: user_groups.select(:group_id)))

低於錯誤

SELECT "execution_groups".* FROM "execution_groups" WHERE "execution_groups"."user_id" IN (SELECT "user_group_table"."user_id" FROM "user_group_table" WHERE "user_group_table"."user_id" = ?)  [["user_id", 6]]
"Threw an exception inside test.new() undefined method `or' for #<ExecutionGroup::ActiveRecord_Relation:0x00007faf9e10ee38>"
Threw an exception inside test.new() undefined method `or' for #<ExecutionGroup::ActiveRecord_Relation:0x00007faf9e10ee38>

讓我們從使用 Rails 查詢語法編寫該查詢開始。

我假設user_group_table可通過UserGroup model 獲得,而execution_groups可通過ExecutionGroup model 獲得。

# in controller
user_groups = UserGroup.where(user_id: 12)

@execution_group_options =
  ExecutionGroup.where(user_id: user_groups.select(:user_id))
  .or(ExecutionGroup.where(group_id: user_groups.select(:group_id)))

這將產生以下 SQL:

SELECT execution_groups.*
FROM execution_groups
WHERE
  execution_groups.user_id IN (
    SELECT user_group_table.user_id
    FROM user_group_table
    WHERE user_group_table.user_id = 12
  )
  OR
  execution_groups.group_id IN (
    SELECT user_group_table.group_id
    FROM user_group_table
    WHERE user_group_table.user_id = 12
  )

哪個應該產生相同的集合(假設沒有具有相同group_idgroupnameExecutionGroup記錄)。

有了上述內容,您可以在視圖中使用以下內容:

options_from_collection_for_select(@execution_group_options, 'group_id', 'groupname')

如果存在具有相同group_idgroupnameExecutionGroup記錄。 您可以改為使用:

options_for_select(@execution_group_options.distinct.pluck(:groupname, :group_id))

如果您無法訪問or (在 Rails 5 上的 Ruby 中引入),事情會變得稍微復雜一些。 您應該能夠使用內部arel接口。

# in controller
user_groups = UserGroup.where(user_id: 12)
exec_groups_table = ExecutionGroup.arel_table

@execution_group_options = ExecutionGroup.where(
  exec_groups_table[:user_id].in(user_groups.select(:user_id).arel)
  .or(exec_groups_table[:group_id].in(user_groups.select(:group_id).arel))
)

這應該產生完全相同的查詢。 除了 controller 代碼之外,沒有任何變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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