需求是比如现在的模型:
class Port < ActiveRecord::Base serialize :locales end
其中的locales字段会包含比如 %w(zh en)这样多个字符串。
locales
%w(zh en)
现在就没研究出来如何可以按照其中的内容进行查询,比如
ports = Port.all.select { |p| p.locales.include? "zh" }
这种的查询需求呢?
serialize 是不可查询的,你这种情况用 has_many
serialize
has_many
#1 楼 @kingwkb 被关联的部分数据量太小,用第三张表感觉太浪费了。
设计上会不会有点问题?
serialize 应该是用于保存程序可读的数据,一般情况下不存在需要去查的需求才对
用 PostgreSQL 等原生支持数组、Hash 的数据库。
这种情况很适合用 bitmask
https://github.com/joelmoss/bitmask_attributes
确定不是用 like 检索么?
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 来封装了我说的查询和创建,赞。
#9 楼 @quakewang 这个 bitmask 的玩法太有创意了
https://gist.github.com/hooopo/9cb0c327141314437510
#11 楼 @hooopo 赞