入力して検索できる一連のヘイズが欲しいのですが。
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.habitsキー値に基づいて酒飲みを検索するにはどうすればよいですか?
Drinker.select {|drinker| drinker[habits][:year] === 2020 && drinker[habits][:drinker_id] === 1 }
それは私の推測ですが、複数のKeyValue検索についてはどこにも見つかりません。
これは実際には、悪いデータベースモデリングで自分の足を撃った典型的な例にすぎません。
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; array、JSON / JSONB、およびhstoreは、本当に特殊なジョブに適したツールです。しかし、何に対してもあなたの最初の選択であってはなりません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加