【问题标题】:Connecting a Rails model to a database view?将 Rails 模型连接到数据库视图?
【发布时间】:2011-03-31 02:41:47
【问题描述】:

我听说您可以将 rails 中的模型绑定到数据库视图(而不是像往常那样使用表),并且只需创建一个具有模型表通常具有的名称的视图即可。

我无法让它在带有 PostgreSQL 9 的 rails 3.0.5 中工作。

我有什么遗漏吗?

【问题讨论】:

  • “我不能让它工作”是什么意思?错误?
  • 错误是:表 'model_name_in_plural' 不存在。不过,Viacheslav Molokov 的解决方案很有效。

标签: ruby-on-rails postgresql


【解决方案1】:

它的 postgresql 适配器中的 Rails 没有在 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。

【讨论】:

    【解决方案2】:

    我猜这可能与复数有关。但如果没有更多信息,这很困难。您创建的视图必须是模型的复数形式。

    例如。

    CREATE VIEW books AS (SELECT * FROM bookshelves)
    

    模型应该称为 Book。

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

    【讨论】:

    • 我试过了,它曾经对我有用,可以在另一个应用程序中使用,但现在不行。不确定是 3.0.5 的怪异还是什么。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多