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答案相同的位置