我有一个属于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 %>
有关如何修复此错误以及代码有什么问题的任何想法?
感谢。
答案 0 :(得分:0)
我通过删除迁移并再次创建它来修复此问题。但是,如果我执行rake db:reset,我会再遇到同样的问题。此命令创建表但不创建postgresql视图,它看起来不像是在执行上一次迁移。我必须删除迁移并再次创建它以使其正常工作。
看起来这次迁移只运行一次?
创建迁移的顺序
我将架构格式更改为:sql config.active_record.schema_format:application.rb中的sql
将模式转储到structure.sql确实有效,但是再次运行rake db:reset不会创建视图。我总是要删除迁移并再次创建它。