当前位置: 首页 > 面试题库 >

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

怀洛华
2023-03-14
问题内容

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

例如,

post.path = "1.2.3"
post.save

应该会产生类似

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

最好的方法是什么?


问题答案:

编辑: 要实现上述目标,您可以使用它来覆盖模型文件中的默认设置器:

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/

就像Rails的插件编写指南一样:

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

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



 类似资料:
  • 问题内容: 这段代码返回一个错误:AttributeError:无法设置属性这真的很遗憾,因为我想使用属性而不是调用方法。有谁知道为什么这个简单的例子不起作用? 问题答案: 这是你想要的吗? 取自http://docs.python.org/library/functions.html#property。

  • 1.如何通过参数化构造函数设置这些属性?? 类文件 > 我想通过传递参数构造函数的setter设置这些属性,但它没有设置这些属性 在这里,我想通过toString方法显示属性 }对象文件 为什么我无法通过构造函数设置这些属性?? public class Runnable{public static void main(String[]args){Product p1=新产品(“pc”,“Grey

  • 问题内容: 我想运行一组通用的食谱,这些食谱将在我们的实验室中供用户选择我们产品的版本,并希望使用jenkins来完成。Jenkins作业在节点引导期间传递此信息的最佳方法是什么?是否通过- j选项,例如-j’{“ load_version”:“ $ LOAD_VERSION”}’,其中$ LOAD_VERSION是Jenins作业的参数,有几种选择? 问题答案: 是的,可以让您为食谱的第一个Ch

  • 了解在 Dreamweaver 中如何使用文本属性检查器应用 HTML 格式或 CSS 格式。 可以使用文本属性检查器应用 HTML 格式或层叠样式表 (CSS) 格式。应用 HTML 格式时,Dreamweaver 会将属性添加到页面正文的 HTML 代码中。应用 CSS 格式时,Dreamweaver 会将属性写入文档头或单独的样式表中。 注意:在创建 CSS 内联样式时,Dreamweave

  • 基本上,我正在做一个项目,其中某些类属性和类的名称存储在文本文件中。这里的目标是创建文本文件中列出的特定数据类型(在本例中为Car)的对象列表(我已经完成了),然后将这些对象分配给文本文件中的数据类型。下面是我将使用的文本文件的示例: 汽车:2辆 4 1 1红色3 80.5 20 60 2aadawd 1 3 2蓝色3 80 30 20 1aaxzd 自行车: 3 2 1 2号2号 2 3 基本上