搜索序列化的数据,用活动记录序列化、数据

2023-09-08 15:42:10 作者:把昨天作废

我想要做的序列化列的简单查询,你是怎么做到这一点?

 连载:我的code,阵列


1.9.3p125:026> MyModel.find(104)。我的code
  为MyModel负载(0.6ms)选择`mymodels`。* FROM`mymodels` WHERE`mymodels`.`id` = 104 LIMIT 1
 => [43565个,43402]
1.9.3p125:027> MyModel.find_all_by_my code([43402])
  为MyModel负荷(为0.7m​​s)选择`mymodels`。* FROM`mymodels` WHERE`mymodels`.`my code` ='[43402]
 => []
1.9.3p125:028> MyModel.find_all_by_my code(43402)
  为MyModel负载(1.2ms的)选择`mymodels`。* FROM`mymodels` WHERE`mymodels`.`my code` = 43402
 => []
1.9.3p125:029> MyModel.find_all_by_my code([43565个,43402])
  为MyModel负载(1.1ms)选择`mymodels`。* FROM`mymodels` WHERE`mymodels`.`my code` IN(43565个,43402)
 => []
 

解决方案

基本上,你不能。 #serialize的缺点是,你绕过你的数据库的原生抽象。你是pretty的很多限制在加载和保存数据。

这是说,一个非常好的方式减慢你的应用程序如蜗牛可能是:

  MyModel.all.select {| M | m.my code.include? 43402}
 
json 反序列化 父子类型 JSON 序列化和反序列化 In Go

这个故事告诉我们:不要使用#serialize您需要查询上的任何数据。

I'm trying to do a simple query of a serialized column, how do you do this?

serialize :mycode, Array


1.9.3p125 :026 > MyModel.find(104).mycode
  MyModel Load (0.6ms)  SELECT `mymodels`.* FROM `mymodels` WHERE `mymodels`.`id` = 104 LIMIT 1
 => [43565, 43402] 
1.9.3p125 :027 > MyModel.find_all_by_mycode("[43402]")
  MyModel Load (0.7ms)  SELECT `mymodels`.* FROM `mymodels` WHERE `mymodels`.`mycode` = '[43402]'
 => [] 
1.9.3p125 :028 > MyModel.find_all_by_mycode(43402)
  MyModel Load (1.2ms)  SELECT `mymodels`.* FROM `mymodels` WHERE `mymodels`.`mycode` = 43402
 => [] 
1.9.3p125 :029 > MyModel.find_all_by_mycode([43565, 43402])
  MyModel Load (1.1ms)  SELECT `mymodels`.* FROM `mymodels` WHERE `mymodels`.`mycode` IN (43565, 43402)
 => [] 

解决方案

Basically, you can't. The downside of #serialize is that you're bypassing your database's native abstractions. You're pretty much limited to loading and saving the data.

That said, one very good way to slow your application to a crawl could be:

MyModel.all.select { |m| m.mycode.include? 43402 }

Moral of the story: don't use #serialize for any data you need to query on.