鸭子可以输入ActiveRecord ORM吗?

时间:2013-11-21 23:07:12

标签: ruby-on-rails oracle sqlite activerecord orm

在我正在使用的应用程序中,生产数据库是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 

2 个答案:

答案 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_functionextract()方法插入您的SQLite:

http://rdoc.info/github/luislavena/sqlite3-ruby/SQLite3/Database#create_function-instance_method

(祝你好运在甲骨文!)