如何让属性设置器通过SQL函数发送值

2024-04-15

我试图在 Rails 生成其 sql 查询之前,使 ActiveRecord 模型中的属性设置器将其值包装在 text2ltree() postgres 函数中。

例如,

post.path = "1.2.3"
post.save

应该生成类似的东西

UPDATE posts SET PATH=text2ltree('1.2.3') WHERE id = 123 # or whatever

这样做的最佳方法是什么?


EDIT:为了准确实现您在上面寻找的内容,您可以使用它来覆盖模型文件中的默认设置器:

def path=(value)
  self[:path] = connection.execute("SELECT text2ltree('#{value}');")[0][0]
end

然后你上面的代码就可以工作了。

我有兴趣了解更多有关 ActiveRecord 的内部结构及其难以理解的元编程基础的信息,因此作为练习,我尝试完成您在下面的评论中描述的内容。这是一个对我有用的示例(全部在 post.rb 中):

module DatabaseTransformation
  extend ActiveSupport::Concern

  module ClassMethods
    def transformed_by_database(transformed_attributes = {})

      transformed_attributes.each do |attr_name, transformation|

        define_method("#{attr_name}=") do |argument|
          transformed_value = connection.execute("SELECT #{transformation}('#{argument}');")[0][0]
          write_attribute(attr_name, transformed_value)
        end
      end
    end
  end
end

class Post < ActiveRecord::Base
  attr_accessible :name, :path, :version
  include DatabaseTransformation
  transformed_by_database :name => "length" 

end

控制台输出:

1.9.3p194 :001 > p = Post.new(:name => "foo")
   (0.3ms)  SELECT length('foo');
 => #<Post id: nil, name: 3, path: nil, version: nil, created_at: nil, updated_at: nil> 

在现实生活中我想你会想要includeActiveRecord::Base 中的模块位于加载路径较早位置的文件中。您还必须正确处理传递给数据库函数的参数类型。最后我了解到connection.execute由每个数据库适配器实现,因此在 Postgres 中访问结果的方式可能会有所不同(此示例是 SQLite3,其中结果集作为哈希数组返回,第一个数据记录的键为 0]。

这篇博文非常有帮助:

http://www.fakingfantastic.com/2010/09/20/concerning-yourself-with-active-support-concern/ http://www.fakingfantastic.com/2010/09/20/concerning-yourself-with-active-support-concern/

Rails 插件创作指南也是如此:

http://guides.rubyonrails.org/plugins.html http://guides.rubyonrails.org/plugins.html

另外,就其价值而言,我认为在 Postgres 中我仍然会使用迁移来创建查询重写规则来执行此操作,但这带来了很好的学习体验。希望它能起作用,我现在可以停止思考如何去做。

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

如何让属性设置器通过SQL函数发送值 的相关文章

随机推荐

  • 获取Web服务的内容

    我有一个像这样的网址here http www myserver com myservice php param foobar 当我在 Safari 的地址栏中输入该内容时 我会看到类似 错误 或 正常 的结果 那么 如何从代码中正确调用该
  • 有没有一种方法可以从一个方法返回多个整数? [复制]

    这个问题在这里已经有答案了 我有一个这样的方法 private double GetHeight return 2 但我希望能够返回两个不同的数字 例如 2 和 3 有什么方法可以在 C 中做到这一点吗 Yes ValueTuple htt
  • Lua 和序列化闭包

    我正在尝试序列化和反序列化 Lua 闭包 我的基本理解是下面的工厂应该生成闭包 并且Lua在函数和闭包之间没有太多区别 即没有类型 闭包 gt function ffactory x return function return x end
  • 如何为 Mac OSX 安装 Java 7 EE SDK 下载为 .sh 文件

    我是在 Mac OSX 上开发 Java 的新手 我想下载 Java 7 EE SDK 这样我就可以使用 Java 进行桌面 移动 企业开发 下载文件是 sh 具体来说java ee sdk 7 jdk7 macosx x64 我不熟悉 J
  • 无法使用 UWP 应用程序访问我的系统上的 Word 文档

    我正在尝试使用 UWP 应用程序 通用 Windows 编辑现有的 Word 文档 但由于某种原因 我收到 文件不存在 错误 我尝试使用下面的代码来访问word文档 using WordprocessingDocument wordDoc
  • 删除列表元素而不发生突变

    假设你有一个清单 gt gt gt m a b c 我想列一个新清单n包含除给定项目之外的所有内容m 例如该项目 a 但是 当我使用 gt gt gt m remove a gt gt gt m m b c 原始列表已发生变化 值 a 从原
  • Azure 应用程序网关中的 SSL 证书错误

    我们按照指南设置 SSL 应用程序网关 https learn microsoft com en us azure application gateway application gateway ssl portal https learn
  • 生产中的CEF3单进程模式

    在生产中使用单一流程模式是否存在任何真正的陷阱 官方声明似乎不鼓励这种做法 但到 目前为止该应用程序一直稳定 CEF1似乎已经被放弃了 如果使用CEF3单进程进行开发 那么后者至少应该成为测试套件的一部分 因此是稳定的 或者事实并非如此 另
  • Google Api:: 错误:invalid_scope

    我使用 google api OAuth2 登录 gmail 帐户 当 gmail 登录时 我进行身份验证 然后收到错误 错误 invalid scope 此应用尚未经过验证可以访问 无效 https www googleapis com
  • 如何在 vscode API 中替换后删除选择

    在为 vscode 创建扩展时 我陷入了选择困境 现在的问题是 当我通过 api 替换某些范围的 textEditor 时 它会替换该范围并选择该范围 对于片段来说这是一个好主意 但我的扩展要求不是选择替换的文本 我在 api 中搜索但没有
  • 如何使用swift、spritekit和xcode调用admob插页式广告?

    我一直在寻找这个问题的答案 我在 Objective C 中找到了很多例子 谷歌开发者文档等 并在 swift 中找到了一些答案 但没有使用 spritekit 并且作为一个新手 我只是还没有无法弥补这些教程中的差距 将它们整合到我的项目中
  • 如何向正在运行的气流服务添加新的 dag?

    我有一个气流服务 当前作为网络服务器和调度程序的单独 Docker 容器运行 两者都由 postgres 数据库支持 我在两个实例之间同步了 dags 并且在服务启动时正确加载了 dags 但是 如果我在服务运行时将新的 dag 添加到 d
  • 无法让测试单元启动在 ruby​​ 1.9.2 中工作

    我正在使用 Ruby 1 9 2 ruby v 生成 ruby 1 9 2p290 2011 07 09 修订版 32553 x86 64 linux 我正在尝试让它工作 require test unit class TestStartu
  • 如何“合并”、“展平”或“透视”将多行返回到单个结果的查询结果?

    我对表进行了一个简单的查询 它返回如下结果 id id type id ref 2702 5 31 2702 16 14 2702 17 3 2702 40 1 2703 23 4 2703 23 5 2703 34 6 2704 1 14
  • 使用vba从雅虎财经抓取数据

    我需要从雅虎财经页面读取股票的收盘价 我在使用谷歌财经页面之前就已经回答了这个问题 但该页面不再可用 我相信谷歌已经完全改变了它的财经页面 我相信我可以在雅虎财经上应用同样的方法 只需稍作修改 假设雅虎财经对股票代码 AAPL 苹果 有以下
  • 如何使用不同用户表的多重身份验证注销 JWT 令牌

    这是 config auth php 中的代码 guards gt web gt driver gt session provider gt users api gt driver gt jwt provider gt users hash
  • 领域文件的大小是如何发展的?

    领域文件的大小是如何发展的 首先 我有一个包含多个属性的领域文件 其中一个是包含 860 个条目的数组 每个数组条目又包含几个属性 一个数组属性声明条目的名称 我观察到以下情况 如果名称属性为 Criteria A1 直到 Criteria
  • SKReceiptRefreshRequest 每次都询问密码

    我在用SKReceiptRefreshRequest验证来自服务器的收据 问题是每次提示密码时它都会询问我 谁能帮我建议一种更好的方法来验证用户收据 这就是我正在做的事情 我正在使用refreshReceipt当应用程序启动时 void r
  • 如何将 GridLayout.Spec 用于扩展多行的列?

    我正在尝试动态创建一个 2 行 4 列的表 但每种情况下行和列的大小不应相同 也许我会附上一张图片 我想 据我了解 当我不使用 XML 标记来使用 setLayoutParams 中的 GridLayout Spec 来实现此目的时 但我不
  • 如何让属性设置器通过SQL函数发送值

    我试图在 Rails 生成其 sql 查询之前 使 ActiveRecord 模型中的属性设置器将其值包装在 text2ltree postgres 函数中 例如 post path 1 2 3 post save 应该生成类似的东西 UP