我如何基于Rails Postgres中的多个键来搜索哈希数组?

问题描述 投票:1回答:1

我想输入一系列可以输入和搜索的仓促。

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 }

那是我的猜测,但是我找不到关于多个键值搜索的任何内容。

arrays ruby-on-rails postgresql hash
1个回答
0
投票
这实际上只是一个糟糕的数据库建模而使自己陷入困境的经典示例。

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是真正专业工作的不错的工具。但绝对不应该成为您的第一选择。

© www.soinside.com 2019 - 2024. All rights reserved.