我有一个外部只读数据库。列在哪里?' LastName',' CreateDate'我想为它做一些别名。例如:
MyModel.select('LastName AS last_name').where(last_name: 'Somebody')
我无法修改数据库的结构,我也不想处理查询结果。在完美的情况下,ActiveRecord必须处理' LastName'和' last_name'在任何函数中作为绝对等效的列。
答案 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)
。
但你必须记住,所有其他方法(拥有,分组和很多)都不会起作用。