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

时间:2015-11-26 13:47:06

标签: ruby-on-rails ruby oracle

我正在使用具有多个数据库用户的现有oracle数据库。我的问题是我必须在我的Ruby on Rails应用程序中集成现有视图,该视图由另一个数据库用户持有。我的用户仅被授予'视图的权利。我怎么处理这个?

3 个答案:

答案 0 :(得分:0)

您可以生成一个模型以从视图中获取数据。根据视图名称和架构,您可能需要覆盖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 %> 

答案 1 :(得分:0)

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

从Oracle网站下载基本的,SQLPlus,SDK,即时客户端 (例如,对于Mac http://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

到你的database.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模式和表名的全部大写。

答案 2 :(得分:0)

感谢大家的帮助!

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

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

  end