PG 运算符不存在:uuid = 文本

Joe*_*ace 5 postgresql ruby-on-rails

我有模型Conversation, User,它们通过 相连has_many *, through: users_conversations

我有这个范围:

class Conversation < ActiveRecord::Base
  has_many :users_conversations
  has_many :users, through: :users_conversations

  scope :by_participants, ->(ids) {
    joins(:users).where("users.id = ALL (ARRAY[?])", ids)
  }
end
Run Code Online (Sandbox Code Playgroud)

预计会找到所有所需用户(严格)参与的对话。

Conversation.by_participants first 
     Failure/Error: its(:first) {is_expected.to eq(@conversation)}

     ActiveRecord::StatementInvalid:
       PG::UndefinedFunction: ERROR:  operator does not exist: uuid = text
       LINE 1: ...= "users_conversations"."user_id" WHERE (users.id = ALL (ARR...
                                                                    ^
       HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
       : SELECT  "conversations".* FROM "conversations" INNER JOIN "users_conversations" ON "users_conversations"."conversation_id" = "conversations"."id" INNER JOIN "users" ON "users"."id" = "users_conversations"."user_id" WHERE (users.id = ALL (ARRAY['7c1a06c8-10c7-417f-96ea-c9c50fcaed35','8af2beca-d5f2-48d7-9857-7b5d124eaac1']))  ORDER BY "conversations"."id" ASC LIMIT 1
     # ./spec/models/conversation_spec.rb:19:in `block (3 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

我尝试注入 array cast (*) as uuid,但 PG 似乎认为这只是字符串:

HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
       : SELECT  "conversations".* FROM "conversations" INNER JOIN "users_conversations" ON "users_conversations"."conversation_id" = "conversations"."id" INNER JOIN "users" ON "users"."id" = "users_conversations"."user_id" WHERE (users.id = ALL (ARRAY['cast (6d4ff0b3-e148-40f8-87b5-d4d03577577a as uuid)','cast (432f4f6e-5832-4831-80dc-c747b8d3e742 as uuid)']))  
Run Code Online (Sandbox Code Playgroud)

Sou*_*yay 4

你试过这个吗

class Conversation < ActiveRecord::Base
  has_many :users_conversations
  has_many :users, through: :users_conversations

  scope :by_participants, ->(ids) {
    joins(:users).where("users.id = ALL (ARRAY[?]::uuid[])", ids)
    # it's all about ARRAY[?]::uuid[] type cast
  }
end
Run Code Online (Sandbox Code Playgroud)

您的目标列是,::uuid[]但源是text,只需键入强制转换并查看结果。