我正在使用gem rails~> 5.2
和gem mysql2 >= 0.3.13, < 0.5
。
我有一个模型Lawer
,其中有一个数组列lawer_filed
[sic]。
# 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语法有一个错误,但我不知道如何解决。有人可以帮忙吗?
最佳答案
MySQL与PostgreSQL不同,它不支持数据库中的数组。因此,您需要添加以下行:
serialize :lawer_field, Array
这意味着您的数据库中有一个
string
字段,但是每当ActiveRecord解包数据库返回的结果时,它都会将它们直接映射到Ruby Array的实例。这意味着您唯一的筛选数据库结果的方法是使用任何MySQL字符串比较功能,LIKE
等。您可以选择使用
LIKE
或执行其他一些String functions(由于无法使用索引,因此效果不佳)或构建另一个表,向其中添加has_many
关联并以这种方式使用MySQL应该被使用。当然,您也可以迁移到PostgreSQL,但这似乎是最极端的选择。编辑:您还可以考虑使用最近添加的MySQL的JSON。不过这取决于您的MySQL版本。
关于mysql - 如何在Rails 5.2中从MySQL查询数组列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56329046/