Hstore 和 Rails

2024-04-27

我正在尝试使用最新版本的 activerecord-postgres-hstore gem 在 Rails 3.2.9 项目中使用 Hstore,但在使用 ActiveRecord 提供的 store_accessor 来获取 Hstore 中的值时遇到了一些麻烦。

我的模型如下所示:

class Person < ActiveRecord::Base
  serialize :data, ActiveRecord::Coders::Hstore
  attr_accessible :data, :name
  store_accessor :data, :age, :gender
end

当我进入 Rails 控制台时,我得到的是:

Loading development environment (Rails 3.2.9)
1.9.3-p327 :001 > p = Person.find(3)
  Person Load (9.8ms)  SELECT "people".* FROM "people" WHERE "people"."id" = $1 LIMIT 1  [["id", 3]]
 => #<Person id: 3, name: "Leo", data: {"age"=>"34", "gender"=>"male"}, created_at: "2012-12-07 15:01:53", updated_at: "2012-12-07 15:27:40"> 
1.9.3-p327 :002 > p.age
 => nil 
1.9.3-p327 :003 > p.age = "204"
 => "204" 
1.9.3-p327 :004 > p.save!
   (0.2ms)  BEGIN
   (0.6ms)  UPDATE "people" SET "data" = 'age=>34,gender=>male,age=>204', "updated_at" = '2012-12-07 15:28:33.097404' WHERE "people"."id" = 3
   (2.2ms)  COMMIT
 => true 
1.9.3-p327 :005 > p
 => #<Person id: 3, name: "Leo", data: {"age"=>"204", "gender"=>"male"}, created_at: "2012-12-07 15:01:53", updated_at: "2012-12-07 15:28:33">
1.9.3-p327 :006 > exit
% rails c                 12-12-07 - 10:28:35
Loading development environment (Rails 3.2.9)
1.9.3-p327 :001 > p = Person.find(3)
  Person Load (6.9ms)  SELECT "people".* FROM "people" WHERE "people"."id" = $1 LIMIT 1  [["id", 3]]
 => #<Person id: 3, name: "Leo", data: {"age"=>"34", "gender"=>"male"}, created_at: "2012-12-07 15:01:53", updated_at: "2012-12-07 15:28:33"> 

注意保存!确实更新了这个人。当我退出控制台并返回时,记录将返回到原始数据集。

另外,请注意,当我尝试访问age它返回零。

如果有人想知道这是什么store_accessorActiveRecord 中的方法

store.rb

def store_accessor(store_attribute, *keys)
  Array(keys).flatten.each do |key|
    define_method("#{key}=") do |value|
      send("#{store_attribute}=", {}) unless send(store_attribute).is_a?(Hash)
      send(store_attribute)[key] = value
      send("#{store_attribute}_will_change!") 
    end

    define_method(key) do
      send("#{store_attribute}=", {}) unless send(store_attribute).is_a?(Hash)
      send(store_attribute)[key]
    end
  end
end        

这很奇怪,因为当我做同样的事情时send(store_attribute)[key]控制台中的行可以正常工作:

1.9.3-p327 :010 >   p.send(:data)['age']
 => "34" 

1.9.3-p327 :011 > p.send(:data)['age'] = "500"
 => "500" 
1.9.3-p327 :012 > p.send("data_will_change!")
 => {"age"=>"500", "gender"=>"male"} 
1.9.3-p327 :013 > p.save!
   (0.2ms)  BEGIN
   (0.7ms)  UPDATE "people" SET "data" = 'age=>500,gender=>male', "updated_at" = '2012-12-07 15:41:50.404719' WHERE "people"."id" = 3
   (1.8ms)  COMMIT
 => true 
1.9.3-p327 :014 > p
 => #<Person id: 3, name: "Leo", data: {"age"=>"500", "gender"=>"male"}, created_at: "2012-12-07 15:01:53", updated_at: "2012-12-07 15:41:50"> 
1.9.3-p327 :015 > exit
% rails c                 12-12-07 - 10:41:57
Loading development environment (Rails 3.2.9)
1.9.3-p327 :001 > p = Person.find(3)
  Person Load (9.3ms)  SELECT "people".* FROM "people" WHERE "people"."id" = $1 LIMIT 1  [["id", 3]]
 => #<Person id: 3, name: "Leo", data: {"age"=>"500", "gender"=>"male"}, created_at: "2012-12-07 15:01:53", updated_at: "2012-12-07 15:41:50"> 
1.9.3-p327 :002 > 

知道这里可能发生什么吗?


我最终放弃了 store_accessor 并使用以下代码为 hstore 键添加访问器

lib/hstore_accessor.rb

module HstoreAccessor
  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def hstore_accessor(hstore_attribute, *keys)
      Array(keys).flatten.each do |key|
        define_method("#{key}=") do |value|
          send("#{hstore_attribute}=", (send(hstore_attribute) || {}).merge(key.to_s => value))
          send("#{hstore_attribute}_will_change!")
        end
        define_method(key) do
          send(hstore_attribute) && send(hstore_attribute)[key.to_s]
        end
      end
    end
  end
end

ActiveRecord::Base.send(:include, HstoreAccessor)

配置/初始化程序/active_record_extensions.rb

require "hstore_accessor"

Person

class Person < ActiveRecord::Base
  hstore_accessor :data, :size, :shape, :smell
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hstore 和 Rails 的相关文章

随机推荐

  • 来自文档和子文档的 $sum 按“$author”分组 (MongoDB)

    这是我的收藏 id 10926400 votes 131 author Jesse comments id 1 votes 31 author Mirek id 2 votes 13
  • 如何正确分叉本地 git 存储库?

    我有一个本地 git 存储库 我想分叉它并将其用作新项目的基础 新项目不应该将任何东西推回到原来的项目 这就是我的think我应该做 git clone originalproject newproject git remote remov
  • 在 MATLAB 中分析 wav 文件

    所以我有这个钢琴录音 wav 格式 我能够做一个FFT整体记录并识别频率 然而 根据我读过的一些文章 最好将 wav 文件分解为多个窗口 其中每个窗口都包含一个特定的音符 为此 我需要首先绘制时域信号的 功率包络 考虑音符平均能量概念 因此
  • 单元测试“混合”WPF/Silverlight 控件

    我正在启动一个新的 WPF Silverlight 自定义控件项目 并希望对此进行单元测试 但是我对如何解决这个问题有点困惑 此控件将基于 WPF 和 Silverlight 的相同代码库 并使用 ifs 和部分类进行少量分叉以消除差异 我
  • Android 13 中文件未删除?

    String path storage emulated 0 Recordings Call Two mp3 File file new File path if file exists File file2 new File file g
  • 如何将输入 type="date" 转换为时间戳?

    我需要转换一个
  • 可以用结构化数据来审查一个人吗?

    我的审查数据围绕people https schema org Person 我想用结构化数据来表示这些评论 像这样的东西 从这里 http moz com ugc getting the most out of schemaorg mic
  • 在 SQL 中合并具有重叠日期范围的记录

    编辑 我们当前的服务器是 SQL 2008 R2 因此 LAG LEAD 功能将不起作用 我正在尝试获取表中的多个数据流并将它们组合成 1 个数据流 鉴于下面的 3 个数据流 我希望最终结果是 1 个优先考虑状态 on 的流 递归似乎是最好
  • 如何使用 YouTube javascript API 获取特定“秒”的 YouTube 视频的缩略图或快照?

    我想拍摄 YouTube 视频的缩略图http www youtube com watch v ffaTjpA1scI http www youtube com watch v ffaTjpA1scI30秒或120秒 我如何使用 youtu
  • SHA 足以检查文件重复吗? (PHP 中的 sha1_file)

    假设您想创建一个文件托管站点 供人们上传文件并向他们的朋友发送链接以供稍后检索 并且您想确保文件在我们存储文件的位置重复 那么 PHP 的 sha1 file 是否足以完成该任务 有什么理由不使用 md5 file 来代替吗 对于前端 它将
  • 即席查询/更新是否开始影响您使用 MongoDB 的工作效率?

    我开发一个 ASP MVC 网站已经快一年了 现在完全在 mongodb 上 我大部分时间都喜欢它 使用 C mongodb 驱动程序和 mongovue 等工具 开发效率非常高 然而 我已经开始达到这样一个地步 有些事情我真的希望我有一个
  • 在 SecureField 的 SwiftUI 中切换 isSecureTextEntry

    我想实现在 SecureField 中显示和隐藏密码的功能 以下是 SecureField 的代码 我添加了按钮 该按钮将被检测到显示和隐藏 SecureField 中的文本 但 swiftUI 没有类似的功能是安全文本条目除了切换之外还有
  • 无法找到模块提供者

    我在使用 PowerShell 时遇到问题 几乎就像没有完全安装一样 这很奇怪 因为它是 Windows 10 并且是附带的 在没有锁定的情况下 我尝试使用另一台正在运行的 Windows 10 计算机上的全新副本替换以下目录 C User
  • 如何使用调查包的 svyby 函数对多个列进行循环?

    我已经尝试了很多方法 但我无法解决问题 我发现here https stackoverflow com questions 13402829 r looping through in survey package here https st
  • 每个命令重置外部差异工具

    我最近安装了一个新的差异工具 差异性的 https github com Wilfred difftastic 这扰乱了我将差异复制到剪贴板 或文件 以发送这些内容的习惯 diff external difft As per https d
  • 无法使用 git 克隆任何存储库

    我尝试克隆一些存储库 但总是遇到相同的错误 我在哪里可以找到有关此错误的更多信息 错误日志文件或类似的文件 或者也许有人知道可能出了什么问题 git clone http github com creationix nvm git nvm
  • Visual Studio 2012 生成后事件 - 错误代码 255

    这是我尝试将应用程序可执行文件复制到另一个文件夹并更改其名称 IF ConfigurationName Release SET DESTINATION ProjectDir Output Distribution IF NOT EXIST
  • 多重绑定多重选择ListView

    好吧 我这里有一个奇怪的 我想要弄清楚的是如何拥有一个由 ObservableCollection 填充的列表视图 根据第一个列表视图的选择更新另一个由另一个 ObservableCollection 填充的 ListView 然后使用 v
  • URLConnection 和 setUseCaches(true)

    我正在使用当前代码在线程中下载图像 Log d TAG Fetching image BASE URL mURL URLConnection connection InputStream input connection new URL B
  • Hstore 和 Rails

    我正在尝试使用最新版本的 activerecord postgres hstore gem 在 Rails 3 2 9 项目中使用 Hstore 但在使用 ActiveRecord 提供的 store accessor 来获取 Hstore