在我的RubyonRails应用程序中集成oracle数据库视图



我正在使用一个现有的oracle数据库,其中有几个数据库用户。我的问题是,我必须在RubyonRails应用程序中集成一个现有视图,该视图由另一个数据库用户持有。我的用户只"授予"了视图的权限。我该如何处理?

我在以下方面取得了成功:

从Oracle网站下载基本、SQLPlus、SDK、即时客户端(例如Machttp://www.oracle.com/technetwork/apps-tech/intel-macsoft-096467.html)

提取以上内容并将其移动到/usr/lib创建这些符号链接:

ln -s libclntsh.dylib.12.1 libclntsh.dylib
ln -s libclntsh.so.12.1 libclntsh.so

将此添加到您的gemfile

  gem 'ruby-oci8'
  gem 'activerecord-oracle_enhanced-adapter', :git => 'git://github.com/rsim/oracle-enhanced.git'

运行bundle install

运行以下命令:

export NLS_LANG="AMERICAN_AMERICA.UTF8"
export ORACLE_HOME=/bin/oracle/11_2x64
export DYLD_LIBRARY_PATH=$ORACLE_HOME
export LD_LIBRARY_PATH=/usr/lib

现在你已经完成了这项工作,添加一个环境,比如:

my_oracle_db:
  adapter: oracle_enhanced
  database: IPADDRESS/INSTANCE
  username: USER
  password: PASSWORD

到您的数据库.yml

现在创建一个模型:

class OracleBase < ActiveRecord::Base
  self.abstract_class=true
  establish_connection (:my_oracle_db)
  #whatever methods
end

然后在Oracle 中根据您的视图创建一个模型

class MyOracleView < OracleBase
  self.table_name = "SCHEMA.NAMEOFORACLEVIEW"
  #whatever methods you want to add
end

然后像往常一样在Rails中创建控制器和视图。另外请注意,您可能需要对Oracle模式和表名使用所有大写字母。

您可以生成一个模型来从视图中获取数据。根据视图名称和模式,您可能需要覆盖AR的默认值。例如,假设您的视图名为other_user_view_ora,并且有一个名为user_id的primary_key,并且您希望以User 的形式访问它

class User < ActiveRecord::Base
  set_primary_key "user_id"
  set_table_name "other_user_view_ora"
  # database perms will enforce this, but just being pedantic
  def readonly?
   true   
  end
end

然后,您应该能够像使用任何ActiveRecord对象一样使用该视图。

另一种选择是通过ActiveRecord::Base.connection发出sql命令。所以在你的控制器中做一些类似的事情

def from_user_view
  @results = ActiveRecord::Base.connection.execute "select * from other_user_view_ora limit 2"
end 

然后在您的视图中,您可以对@results数组进行迭代,将每个结果视为散列。

示例:

<% @results.each do  |result| %> 
  <td><%=result['user_id']%></td>
  <td><%=result['name']%></td>
<% end %> 

感谢大家的帮助!

作为@JimEvans的解决方案,创建一个模型是令人满意的:

  class TankBank < ActiveRecord::Base
  self.table_name = "GEVIS.TANK_BANK"
  end

最新更新