如何创建具有ActiveRecord功能但没有实际表格的模型?

时间:2014-10-11 17:53:56

标签: ruby-on-rails-4

我认为这是互联网上一个经常出现的问题,但不幸的是我仍然无法找到成功的答案。

我正在使用Ruby on Rails 4,我想创建一个与SQL查询接口的模型,而不是数据库中的实际表。例如,假设我的数据库中有两个表:QuestionsAnswers。我想制作一个包含两个表统计信息的报告。为此,我有一个复杂的SQL语句,它从这些表中获取数据以构建统计信息。但是,SQL语句中使用的SELECT不会直接从Answers和Questions表中获取值,而是从嵌套的SELECT中获取值。

到目前为止,我已经能够创建StatItem模型,没有任何迁移,但是当我尝试StatItem.find_by_sql("...nested selects...")时,系统会抱怨数据库中未显示的表stat_items

如何创建一个模型,其实例的数据是从复杂查询而不是从表中检索的?如果不可能,我可以创建一个临时表来存储数据。在这种情况下,如何告诉迁移文件不创建这样的表(它将由查询创建)?

2 个答案:

答案 0 :(得分:1)

如何从复杂查询创建实体化视图并遵循本教程:

ActiveRecord + PostgreSQL Materialized Views

答案 1 :(得分:0)

迈克尔科尔和他的物化视图提议给了我一个想法,我最初放弃了,因为我错误地认为单个数据库连接可以由两个进程共享,但在阅读了Rails如何处理请求后,我认为我的解决方案很好。

第1步 - 创建不迁移的模型

rails g model StatItem --migration=false

第2步 - 创建一个名为stat_items

的临时表
#First, drop any existing table created by older requests (database connections are kept open by the server process(es).
ActiveRecord::Base.connection.execute('DROP TABLE IF EXISTS stat_items')

#Second, create the temporary table with the desired columns (notice: a dummy column called 'id:integer' should exist in the table)
ActiveRecord::Base.connection.execute('CREATE TEMP TABLE stat_items (id integer, ...)')

第3步 - 执行在stat_items中插入行的SQL语句

第4步 - 像往常一样使用模型访问表格

例如:

StatItem.find_by_...

非常感谢任何评论/改进。