用于大写字段的ActiveRecord动态查找器

时间:2014-12-19 15:08:43

标签: ruby-on-rails ruby-on-rails-4 activerecord

使用大写用于列名称的旧表。重命名列不是一种选择。

我正在尝试使用表格/模型的COLUMN_NAME属性找到记录。

这些陈述:

c = MetaColumn.find_by_COLUMN_NAME('PATIENT_ID')
c = MetaColumn.find_by_column_name('PATIENT_ID')

生成错误:

formal argument cannot be a constant
          def self.find_by_name(COLUMN_NAME, options = {})

这些陈述按预期工作:

> c = MetaColumn.find_by column_name: 'PATIENT_ID'
> c = MetaColumn.find_by COLUMN_NAME: 'PATIENT_ID'

有没有办法表明COLUMN_NAME是一个字段,而不是常量?

2 个答案:

答案 0 :(得分:0)

您可以为列名称添加别名:

alias_attribute :new_column_name, :real_column_name

当然,如果没有其他任何内容触及该数据库,您可以考虑重命名列名:

 class ChangeOldColumnToNewColumn < ActiveRecord::Migration
      def change
          rename_column :tableName, :oldColumn, :newColumn
      end
 end

答案 1 :(得分:0)

您应该尝试修改您丢失的方法以提升您的搜索查询以反映数据库,以便您的方法看起来像#rails;类似&#34;对于任何追随你的人尝试以下操作,这应该允许您仍然使用find_by_column等方法,并在幕后将其翻译为大写。

def method_missing(m, *args, &blk)
  m = m.to_s.upcase if @attributes.include? m.to_s.upcase.gsub(/=/, '')
  super(m, *args, &blk)
end