在我正在使用的应用程序中,生产数据库是Oracle,开发数据库是sqlite。
大多数应用程序代码都是高级ActiveRecord,但是有一些自定义sql用于报告。这个sql根据后端db而有所不同。
不是扩展ORM和适配器,也不是在整个应用程序中编写if语句,而是可以对连接进行类型化,以便类似下面的代码:
if Archive.connection.supports_function?("EXTRACT")
Archive.select("extract(year from created_at)")...
else
Archive.select("strftime('%Y', created_at)")...
end
答案 0 :(得分:2)
我可能完全误解了您的要求,但您可以检查适配器并轻松更改用于方法的代码。 如果要将新的提取方法添加到activerecord,其行为方式有两种,例如:
# config/initializers/active_record_extract.rb
class ActiveRecord::Base
def self.extract_agnostic(oracle_column, default_column)
if ActiveRecord::Base.connection.instance_values["config"][:adapter].include?('oracle')
return self.select("extract(#{column1} from created_at)")...
end
self.select("strftime(#{default_column}, created_at)")...
end
end
# Usage:
Archive.extract_agnostic("year", "%Y")
显然这不完美,但应该让你开始吗?
我不认为rails可以告诉你你的适配器是否理解命令,但是你总是可以尝试在begin/rescue
中包装你想要的命令:
begin
self.select("extract(year from created_at)")...
rescue # the above failed, try something else
self.select("strftime('%Y', created_at)")...
end
答案 1 :(得分:0)
为什么不能为您的开发环境运行Oracle数据库..?抓一点 - 我不想知道。
使用create_function
将extract()
方法插入您的SQLite:
http://rdoc.info/github/luislavena/sqlite3-ruby/SQLite3/Database#create_function-instance_method
(祝你好运在甲骨文!)