ruby 为什么ActiveRecord::Store.store_acessor在查询时不反映结果SQL

eimct9ow  于 2023-06-22  发布在  Ruby
关注(0)|答案(1)|浏览(110)

考虑这个类:

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')
yhqotfr8

yhqotfr81#

ActiveRecord的构建并不是为了真正关心hstore、json或数组列的内容。AR是围绕具有表和列的关系模型构建的。表中的列对应于模型中的属性。
Hstore,json和数组类型是相对较新的数据库特性,并不是绝对没有多语言。实现因数据库而异。在ActiveRecord中,对这些列的支持实际上是由数据库驱动程序而不是框架本身提供的。
store_accessor只是创建了一个getter/setter,并为模型中的属性设置了脏跟踪。它不会“显式地告诉”AR特定键存在于hstore列中--记住AR不关心hstore列的内容。
事实上,我会说,如果你是这样使用它的一个非常明显的迹象,你已经成为受害者的JSON/hstore anti-pattern

相关问题