Rails中名为"class"的列的旧表

Ann*_*nna 10 ruby-on-rails

我有一个遗留表,我的rails应用程序与另一个应用程序共享.它有一个名为"class"的列.我第一次引用该模型中的任何属性时,出现错误.对属性的后续引用有效.有没有一个很好的解决方法,或者我应该去修改使用此表的其他应用程序(呃)?

>> Member::Ssg.find(:first)
 => #<Member::Ssg ssg_key: #<BigDecimal:10b169688,'0.253E3',4(8)>, org_id: 2, academic_year: 2006, class: true, next_due_date: "2011-06-01", submitted_date: "2006-02-13", notes: nil, owner_id: "1">
 >> Member::Ssg.find(:first).notes
 NoMethodError: undefined method `generated_methods' for true:TrueClass
        from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/attribute_methods.rb:247:in `method_missing'
        from (irb):2
>> Member::Ssg.find(:first).notes
=> nil
Run Code Online (Sandbox Code Playgroud)

解决方案:我使用了Bellmyer解决方案的组合,并将下面的代码添加到我的模型中

 class << self
   def instance_method_already_implemented?(method_name)
     return true if method_name == 'class'
     super
   end
 end
Run Code Online (Sandbox Code Playgroud)

Jai*_*yer 9

注意:请参阅本答复末尾的更新解决方案.出于历史原因离开原来过时的解决方案.

这经常出现(遗留列名称干扰ruby/rails),我可能只是从中创建一个插件.不过,这是你可以立即修复它的方法.在您的应用中创建此文件:

# lib/bellmyer/create_alias.rb
module Bellmyer
  module CreateAlias
    def self.included(base)
      base.extend CreateAliasMethods
    end

    module CreateAliasMethods
      def create_alias old_name, new_name
        define_method new_name.to_s do
          self.read_attribute old_name.to_s
        end

        define_method new_name.to_s + "=" do |value|
          self.write_attribute old_name.to_s, value
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

现在,在你的模型中:

class Member < ActiveRecord::Base
  include Bellmyer::CreateAlias
  create_alias 'class', 'class_name'
end
Run Code Online (Sandbox Code Playgroud)

create_alias的第一个参数是旧方法名称,第二个参数是您要调用它的新名称,它不会干扰rails.它基本上使用read_attributewrite_attribute方法来与列进行交互,而不是使用ActiveRecord定义的ruby方法.请务必在任何地方使用该字段的新名称,如下所示:

member.class_name = 'helper'
Run Code Online (Sandbox Code Playgroud)

这适用于ruby 1.8,但我还没有测试过ruby 1.9.我希望这有帮助!

更新:我找到了一个更好的解决方案,适用于Rails 3,即safe_attributes gem.我写了一篇博客文章,解释了如何使用它,带有示例代码片段,以及一个完整的示例应用程序,您可以从github下载并使用它.这是链接:

Rails中的旧数据库列名3