如何在Rails5.2中从mysql查询数组列?

hwamh0ep  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(423)

我正在使用 gem rails~> 5.2 以及 gem mysql2 >= 0.3.13, < 0.5 .
我有个模特 Lawer ,它有一个数组列 lawer_filed [原文如此]。


# Model lawer.rb

serialize :lawer_field, Array

然后我创造了一个 Lawer ,我就能拿到 lawer_field 数值如下:

=> Lawer.first.lawer_field

=> ["2", "3", "5"]

现在,我想找一个 Lawer 使用查询 lawer_field . 我试过:

@lawer = Lawer.where("lawer_field && ARRAY[?]", "2")

出现了这样的错误:

ActiveRecord::StatementInvalid (Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '['2']) LIMIT 11' at line 1: SELECT  `lawers`.* FROM `lawers` WHERE (lawer_field && ARRAY['2']) LIMIT 11)

我的sql语法有一个错误,但我不知道如何修复它。有人能帮忙吗?

wlp8pajw

wlp8pajw1#

与postgresql不同,mysql不支持数据库中的数组。因此,您需要添加以下行:

serialize :lawer_field, Array

这意味着你有一个 string 字段,但每当activerecord解包数据库返回的结果时,它会将它们直接Map到ruby数组的示例。这意味着在数据库中过滤结果的唯一选择是使用任何mysql字符串比较函数, LIKE 等等。
你的选择是 LIKE 或者执行其他一些字符串函数(由于无法使用索引,因此执行效果不佳)或者构建另一个表,添加 has_many 与之关联,并按预期的方式使用mysql。当然,您也可以迁移到postgresql,但这似乎是最极端的选择。
编辑:您还可以考虑使用最近添加的mysql的json。这取决于你的mysql版本。

qjp7pelc

qjp7pelc2#

我没有尝试这个答案,因为我没有任何rails项目可以测试,但我认为问题出在语法上。
我想应该是这样的: Lawer.where("lawer_field IN (?)", "2")

相关问题