ActiveRecord列的别名在'其中'功能

时间:2014-09-15 05:27:09

标签: sql ruby-on-rails activerecord

我有一个外部只读数据库。列在哪里?' LastName',' CreateDate'我想为它做一些别名。例如:

MyModel.select('LastName AS last_name').where(last_name: 'Somebody')

我无法修改数据库的结构,我也不想处理查询结果。在完美的情况下,ActiveRecord必须处理' LastName'和' last_name'在任何函数中作为绝对等效的列。

1 个答案:

答案 0 :(得分:0)

您必须对SQL和Rails执行操作。

class MyModel

  def last_name=(v)
    return self.LastName=(v)
  end

  def last_name(reload = false)
     return LastName(reload)
  end

  scope :with_last_name, -> {
     select("#{MyModel.table_name}.*, LastName AS last_name")
  }
end

然后,您可以像这样使用它:

MyModel.with_last_name.where(:last_name => "Somebody")

修改

你是对的。

另一种解决方案是定义您自己的where方法,如下所示:

def translate(h)
   return { :created_at => 'CREATEDAT' }[h] || h
end

def self.my_where(opts)
  opts2 = opts.inject({}) do |o,(h,v)|
    o[translate(h)] = v; o
  end
  return where(opts2)
end

然后,拨打M.my_where(:created_at => v)的电话会调用M.where('CREATEDAT' => v)

但你必须记住,所有其他方法(拥有,分组和很多)都不会起作用。