Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails.where for array is';他没有按预期工作_Ruby On Rails_Ruby_Postgresql - Fatal编程技术网

Ruby on rails Rails.where for array is';他没有按预期工作

Ruby on rails Rails.where for array is';他没有按预期工作,ruby-on-rails,ruby,postgresql,Ruby On Rails,Ruby,Postgresql,我正在查找@messages.visibility(数组)与当前用户.id匹配的记录,方法如下: @messages = Message.where(visibility: [current_user.id]) 然而,它没有返回任何东西!太令人沮丧了。下面是应位于该@messages集合中的消息示例: 2.3.3 :007 > Message.last Message Load (0.4ms) SELECT "messages".* FROM "me

我正在查找
@messages.visibility
(数组)与
当前用户.id
匹配的记录,方法如下:

@messages = Message.where(visibility: [current_user.id])
然而,它没有返回任何东西!太令人沮丧了。下面是应位于该
@messages
集合中的消息示例:

2.3.3 :007 > Message.last
  Message Load (0.4ms)  SELECT  "messages".* FROM "messages" ORDER BY "messages"."id" DESC LIMIT $1  [["LIMIT", 1]]
 => #<Message id: 35, subject: "hello!", content: "can you see this", user_id: 40, created_at: "2020-08-06 03:22:59", updated_at: "2020-08-06 03:22:59", visibility: ["55", "49"], active: true> 
但这太荒谬了。我看到的每一个地方都说第一个电话应该有效,我做错了什么

以下是我的消息模式:

create_table "messages", force: :cascade do |t|
    t.string "subject"
    t.string "content"
    t.bigint "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.text "visibility", default: [], array: true
以下是收集数据的表格:

<%= form_with(model: @message) do |form| %>
<%= form.check_box(:visibility, {:multiple => true}, u.id, nil) %> - <%= u.email %>
<% end %>

true},u.id,nil)%>-
这应该可以:

Message.where('visibility @> ARRAY[?]::string[]', ["49"])
或者这个:

Message.where("'49' = ANY(visibility)")

下面是如何在数据库中执行此操作,而不管数据库是否支持数组

有一种模式是如何将序列化数组存储在数据库中的。
[“55”,“49”]
将存储为
“55”\n“49”\n
(或
55\n 49\n

因此,您可以使用
类似的
运算符进行搜索

@messages = Message.where("visibility LIKE ?", "% #{current_user.id}\n%")

注意:
%{current_user.id}

中的
%
之间有空格,您也可以使用此空格

Message.where("visibility && array[?]",current_user.id.to_s)
我正在将
当前用户.id
转换为
字符串
,因为
可见性
是一个
字符串数组
,不能与id的整数值进行比较

您还可以按以下方式指定它:

Message.where("visibility && array[?]",[current_user.id.to_s])
Message.where("visibility && array[?]",['55','49'])
或使用多值数组,如下所示:

Message.where("visibility && array[?]",[current_user.id.to_s])
Message.where("visibility && array[?]",['55','49'])

将多个值作为和操作进行比较。

为什么要使用数组而不是关联?此外,您可以检查它们建议与@Spikie答案相同的位置