考虑这个类:
class UsersMigration < ActiveRecord::Migration[5.2]
def change
create_table(:users) do |t|
t.hstore :settings
end
end
end
class User < ActiveRecord::Base
store_accessor :settings, :privileges, :colors
end
执行此查询时:
User.where(privileges: 'Admin')
它会导致以下错误:ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column users.privileges does not exist)
和是正确的,因为该列实际上是设置
为了进行查询,我们必须这样做:
User.where("settings->'privileges' = 'Admin'")
如果模型已经显式序列化到hstore列,为什么第一个查询不会导致以下SQL:
SELECT "user".* FROM "users" WHERE (settings->'privileges' = 'Admin')
1条答案
按热度按时间yhqotfr81#
ActiveRecord的构建并不是为了真正关心hstore、json或数组列的内容。AR是围绕具有表和列的关系模型构建的。表中的列对应于模型中的属性。
Hstore,json和数组类型是相对较新的数据库特性,并不是绝对没有多语言。实现因数据库而异。在ActiveRecord中,对这些列的支持实际上是由数据库驱动程序而不是框架本身提供的。
store_accessor
只是创建了一个getter/setter,并为模型中的属性设置了脏跟踪。它不会“显式地告诉”AR特定键存在于hstore列中--记住AR不关心hstore列的内容。事实上,我会说,如果你是这样使用它的一个非常明显的迹象,你已经成为受害者的JSON/hstore anti-pattern。