新手问题 关于 AR 中,serialized 属性的查询

匿名 · 2014年03月17日 · 最后由 quakewang 回复于 2014年03月23日 · 2524 次阅读

需求是比如现在的模型:

class Port < ActiveRecord::Base
  serialize :locales
end

其中的locales字段会包含比如 %w(zh en)这样多个字符串。

现在就没研究出来如何可以按照其中的内容进行查询,比如

ports = Port.all.select { |p| p.locales.include? "zh" }

这种的查询需求呢?

serialize 是不可查询的,你这种情况用 has_many

匿名 #2 2014年03月17日

#1 楼 @kingwkb 被关联的部分数据量太小,用第三张表感觉太浪费了。

设计上会不会有点问题?

serialize 应该是用于保存程序可读的数据,一般情况下不存在需要去查的需求才对

用 PostgreSQL 等原生支持数组、Hash 的数据库。

确定不是用 like 检索么?

#2 楼 @francis_tm 你这么节省数据库,你老板知道吗

PostgreSQL,可以查 hstore 里的 key

如果你的数据量不多,可以用位操作来处理:

zh => 1
en => 2
jp => 4

Post.create(:locales => 1 + 2) # zh, en
Post.create(:locales => 1 + 4) # zh, jp
Post.create(:locales => 2 + 4) # en, jp

Pos.where("locales & 1 > 0") #查询locale 为 zh
Pos.where("locales & 5 > 0") #查询locale 包含 zh或者jp

缺点是无法利用 locales 上的索引,数据量大的话,还是另外建立关联一个表来查询更加方便。

=======编辑分割线======= #5 楼 @_kaichen 已经提供一个 gem 来封装了我说的查询和创建,赞。

匿名 #10 2014年03月19日

#9 楼 @quakewang 这个 bitmask 的玩法太有创意了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号