我想输入一系列可以输入和搜索的仓促。
add_column :drinkers, :habits, :text, array: true, default: []
drinker.habits << { year: DateTime.now.year, month: DateTime.now.month, drinker_id: drinker_id, napped_at_8am: true }
我如何根据多个饮酒者。习惯键值搜索饮酒者?
Drinker.select {|drinker| drinker[habits][:year] === 2020 && drinker[habits][:drinker_id] === 1 }
那是我的猜测,但是我找不到关于多个键值搜索的任何内容。
Postgres数组是用于真正特殊任务的好工具,在这些任务中,您具有简单的标量值数组,例如整数或字符串。如果您要存储哈希,它们不是一个好主意。如果将Ruby哈希表推到数组列中,则将导致无法查询的混乱。
JSON / JSONB类型可以存储诸如对象数组之类的更复杂的结构,如果数据拒绝对架构进行确认的任何尝试,则是一种有效的选择。虽然可以使用include运算符查询对象数组:
SELECT *
FROM "drinkers"
WHERE habits @> '[{"year": 2020}]'
如果数据是结构化的,那么您在这里确实没有任何帮助。一旦增加了复杂性,查询将变得很可怕,并且您将没有任何索引可以加快查询速度。相反,您只想面对关系数据库是表格形式的事实,而在关系数据库中对数据进行建模的方法是-您猜对了-表。
class Drinker < ApplicationRecord has_many :habits end class Habit < ApplicationRecord belongs_to :drinker end Drinker.joins(:habits) .where(habits: { year: 2020 })
TLDR;数组,JSON / JSONB和hstore是真正专业工作的不错的工具。但绝对不应该成为您的第一选择。