使用带表名和postgresql视图的ActiveRecord时,Controller中的ActiveRecord :: StatementInvalid

时间:2017-05-21 15:06:22

标签: ruby-on-rails postgresql rails-activerecord

我有一个属于Repeat的事件,我正在尝试在显示事件时显示重复标题。但是我不希望这会产生两个数据库调用

@event.Repeat.title

我使用下面的迁移

创建了一个postgresql视图
class EventWithRepeat < ActiveRecord::Migration[5.1]
  def up
    self.connection.execute %Q( create view event_with_repeat as
                                Select events.*, repeats.title as RepeatTitle from Events
                                inner join repeats on events.repeat_id = repeats.id; )
  end

  def down
    self.connection.execute %Q( drop view event_with_repeat; )
  end

end

问题肯定在于上面的迁移。我似乎无法只运行迁移。执行rake db:migrate不会执行任何操作。 rake db:migrate:down,版本导致错误,因为该关系不存在,因此无法删除它。

直接在数据库中创建SQL视图确实有效,但我的迁移似乎没有执行。我正在使用rails 5.

这是我的ActiveRecord类

class EventRepeat < ActiveRecord::Base
  self.table_name = "event_with_repeat"
  self.primary_key = "id"

  def readonly?
    true
  end
end

这是我的控制器类中的方法

def show
    @event = EventRepeat.find(params[:id])
end

我运行了迁移,我可以在psql中查看视图,因此视图存在。我确实做了db:reset但没有帮助。

错误消息显示问题与此SQL

有关
SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
                     c.collname, col_description(a.attrelid, a.attnum) AS comment
                FROM pg_attribute a
                LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                LEFT JOIN pg_type t ON a.atttypid = t.oid
                LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation
               WHERE a.attrelid = '"event_with_repeat"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum

,错误消息是

ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR:  relation "event_with_repeat" does not exist

但视图event_with_repeat确实存在。

我认为这是

<%= @event.RepeatTitle %>

有关如何修复此错误以及代码有什么问题的任何想法?

感谢。

1 个答案:

答案 0 :(得分:0)

我通过删除迁移并再次创建它来修复此问题。但是,如果我执行rake db:reset,我会再遇到同样的问题。此命令创建表但不创建postgresql视图,它看起来不像是在执行上一次迁移。我必须删除迁移并再次创建它以使其正常工作。

看起来这次迁移只运行一次?

创建迁移的顺序

  1. 20170515163011_create_events
  2. 20170520203458_create_repeats
  3. 20170520203852_add_repeat_to_event
  4. 20170521190734_event_with_repeat
  5. 我将架构格式更改为:sql config.active_record.schema_format:application.rb中的sql

    将模式转储到structure.sql确实有效,但是再次运行rake db:reset不会创建视图。我总是要删除迁移并再次创建它。