将Rails模型连接到数据库视图?

6

我听说在rails中可以将模型绑定到数据库视图(而不是通常的表格),只需创建一个视图并使用与模型表格相同的名称即可实现。

但我在Rails 3.0.5和PostgreSQL 9中无法实现此功能。

是否有什么步骤我漏掉了?


“我无法让它工作”是什么意思?出现了错误吗? - Zabba
错误信息为:表'model_name_in_plural'不存在。Viacheslav Molokov的解决方案可行。 - Valentin V
2个回答

9

Rails在其postgresql适配器中没有查找pg_views视图用于其模型。

您应该像为您的普通模型一样为视图命名。

您可以创建一个小技巧,例如以下代码来解决此问题:

# -*- encoding: utf-8 -*-

ActiveSupport.on_load(:active_record) do
  ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
    def table_exists?(name)
      return true if super
      name          = name.to_s
      schema, table = name.split('.', 2)

      unless table # A table was provided without a schema
        table  = schema
        schema = nil
      end

      if name =~ /^"/ # Handle quoted table names
        table  = name
        schema = nil
      end

      query(<<-SQL).first[0].to_i > 0
          SELECT COUNT(*)
          FROM pg_views
          WHERE viewname = '#{table.gsub(/(^"|"$)/,'')}'
          #{schema ? "AND schemaname = '#{schema}'" : ''}
      SQL
    end
  end
end

将以下代码放入文件 RAILS_ROOT/config/initializers/postgresql_view_support.rb 中。

PS:

此代码适用于 Rails 3.0.5 版本。


1
我猜这可能与复数有关。但是没有更多的信息,很难确定。您创建的视图需要是该模型的复数形式。
例如:
CREATE VIEW books AS (SELECT * FROM bookshelves)

模型应该被称为Book。

或者你可以在config/inflections.rb中设置自定义的不可数复数形式。


我尝试过那个方法,在另一个应用程序中很久以前曾经起作用过一次,但现在不行了。不确定是3.0.5的问题还是其他什么原因。感谢帮助。 - NJ.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接