【问题标题】:Rails ActiveRecord: Automatically Alias/Append Suffix?Rails ActiveRecord:自动别名/附加后缀?
【发布时间】:2009-02-04 01:24:28
【问题描述】:

我有一个遗留数据库,其中包含一堆白痴命名的列,例如:

some_field_c
some_other_field_c
a_third_field_c

我非常想创建一个 Rails ActiveRecord 子类,它会自动将这些属性别名为其名称减去下划线和“c”。但是,当我尝试时:

attributes.each_key do | key |
  name = key
  alias_attribute key.to_sym, key[0, (key.length -2)].to_sym if key =~ /_c$/
end

在我的类定义中,出现“未定义的局部变量或方法‘属性’”错误。我也尝试过覆盖这些方法:

method_missing
respond_to?

但我也不断收到该路线的错误。

所以我的问题(实际上是问题)是/是:

  1. 我正在尝试做的事情可能吗?
  2. 如果是这样,最好的方法是什么(缺少迭代别名或覆盖方法)?
  3. 如果不是太麻烦的话,一个非常简短的代码示例来说明如何执行 #2 会很棒。

提前感谢本文收到的任何答复。

【问题讨论】:

  • 你能发布一个完整的例子吗?这应该很容易上手

标签: ruby-on-rails ruby activerecord attributes


【解决方案1】:

您的问题可能是attributes 是一个实例方法,而您是在类的上下文中执行此操作的。最接近你想要的类方法是column_names

【讨论】:

  • 成功了,谢谢!我确实必须将代码放入由子类调用的方法中才能使其工作,如果有某种方式可以说“在任何子类之后立即运行此重新别名代码-发生类属性创建”,但是 耸耸肩 哦,好吧。再次感谢!
  • 我试图将我的工作代码粘贴到这里,但注释格式毁了它:-( 但是,它基本上与我的问题中的代码相同,除了“column_names”而不是“attributes” ,并且没有“name = key”(那行是垃圾),所有这些都定义在由子类调用的方法中。
【解决方案2】:

你可以这样做:

methods.each do |method|
  if method.ends_with("_c") then
    self.send(:defind_method,method.slice(0,-2)){self.send(method)}
  end
end

【讨论】:

    【解决方案3】:

    嗯...我提出了这个我认为非常优雅的小解决方案...

    不确定这是否可行,但我将 method_missing 别名为仍然允许 active_record 这样做:

    module ShittyDatabaseMethods
      alias :old_method_missing :method_missing
    
      def method_missing(method)
        if methods.include?("#{method}_c")
          send("#{method}_c".to_sym)
        else
          old_method_missing(method)
        end
      end
    
    end
    
    class Test
      attr_accessor :test_c
      include ShittyDatabaseMethods
    end
    

    您可能无法将您的模块命名为“ShittyDatabaseMethods”,但您明白了;)一旦您定义了该模块并将其填充到 lib 中,您只需包含该模块即可:D

    很想知道这是否适合你:)

    【讨论】:

    • 谢谢,但不幸的是,这行不通:-(如果我做类似 my_shitty_object.some_attribute = 5 的事情,它会成为对“some_attribute =”的方法调用;如果你将“_c”附加到你获取“some_attribute=_c”作为您的方法名称,而不是“some_attribute_c=”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    相关资源
    最近更新 更多