如何在没有支持表的情况下在 Rails 中创建只读模型

2024-01-05

我想创建只读模型,这可能是一些复杂的结果 与任何直接表模型类关系不大的联接或聚合查询 我已经定义了。

例如想象中的 ActiveRecord::View 类

class B < ActiveRecord::View
    default_scope do
        find_by_sql <<-EOF
            select x.alpha alpha, y.a_id a_id from
            x.join y on x.id = y.id
        EOF     
    end

    belongs_to :a
end

class A < ActiveRecord::Base
    has_many :b
end

>> a = A.first
>> puts a.id

10

>> puts a.bs.to_sql

select x.alpha alpha, y.a_id a_id from
x.join y on x.id = y.id
where a_id = 10

我确信上面的内容或类似的内容是可用的,但我只是找不到它。


我发布了 Ruby GEM 来解决这个问题

https://github.com/bradphelan/Active-Illusion https://github.com/bradphelan/Active-Illusion

验证行为的规范文件是

require 'rubygems'
require 'active_illusion'
require 'squeel'

TIMES = (ENV['N'] || 10000).to_i

require 'rubygems'
require "active_record"

conn = { :adapter => 'sqlite3', :database => ':memory:' }
ActiveRecord::Base.establish_connection(conn)

class User < ActiveRecord::Base
    connection.create_table :users, :force => true do |t|
        t.string :name, :email
        t.timestamps
    end

    has_many :exhibits
end

class Exhibit < ActiveRecord::Base
    connection.create_table :exhibits, :force => true do |t|
        t.belongs_to :user
        t.string :name
        t.text :notes
        t.integer :ssn
        t.timestamps
    end

    belongs_to :user

    def look; attributes end
    def feel; look; user.name end

    def self.look(exhibits) exhibits.each { |e| e.look } end
    def self.feel(exhibits) exhibits.each { |e| e.feel } end
end

module ActiveRecord
    class Faker
        LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse non aliquet diam. Curabitur vel urna metus, quis malesuada elit. Integer consequat tincidunt felis. Etiam non erat dolor. Vivamus imperdiet nibh sit amet diam eleifend id posuere diam malesuada. Mauris at accumsan sem. Donec id lorem neque. Fusce erat lorem, ornare eu congue vitae, malesuada quis neque. Maecenas vel urna a velit pretium fermentum. Donec tortor enim, tempor venenatis egestas a, tempor sed ipsum. Ut arcu justo, faucibus non imperdiet ac, interdum at diam. Pellentesque ipsum enim, venenatis ut iaculis vitae, varius vitae sem. Sed rutrum quam ac elit euismod bibendum. Donec ultricies ultricies magna, at lacinia libero mollis aliquam. Sed ac arcu in tortor elementum tincidunt vel interdum sem. Curabitur eget erat arcu. Praesent eget eros leo. Nam magna enim, sollicitudin vehicula scelerisque in, vulputate ut libero. Praesent varius tincidunt commodo".split
        def self.name
            LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join ' '
        end

        def self.email
            LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join('@') + ".com"
        end
    end
end

class Test0 < ActiveRecord::Illusion
  column :name
  column :exhibition
  column :number
  #belongs_to :user, :foreign_key => :name

  view do
    User.joins{exhibits}.select{
      [users.name.as(name), exhibits.name.as(xname), exhibits.ssn.as(number) ]
    }
  end
end

# pre-compute the insert statements and fake data compilation,
# so the benchmarks below show the actual runtime for the execute
# method, minus the setup steps

# Using the same paragraph for all exhibits because it is very slow
# to generate unique paragraphs for all exhibits.
notes = ActiveRecord::Faker::LOREM.join ' '
today = Date.today


describe ActiveRecord::Illusion do
    before :each do

        User.destroy_all

        Exhibit.destroy_all

        puts 'Inserting 100 users and exhibits...'
        100.times do |i|
            user = User.create(
                :created_at => today,
                :name       => ActiveRecord::Faker.name,
                :email      => ActiveRecord::Faker.email
            )

            Exhibit.create(
                :created_at => today,
                :name       => ActiveRecord::Faker.name,
                :user       => user,
                :notes      => notes,
                :ssn        => i
            )
        end

    end

    it "should have 100 users" do
        User.count.should == 100
    end

    it "should have 100 exhibits" do
        Exhibit.count.should == 100
    end

    describe Test0 do
        it "should retrieve 100 rows" do
            Test0.where{}.to_sql.should ==
            %Q[SELECT \"test0s\".* FROM (SELECT \"users\".\"name\" AS name, \"exhibits\".\"name\" AS xname, \"exhibits\".\"ssn\" AS number FROM \"users\" INNER JOIN \"exhibits\" ON \"exhibits\".\"user_id\" = \"users\".\"id\") test0s ]
            Test0.count.should == 100


            Test0.where{number < 20}.to_sql.should ==
              %Q[SELECT "test0s".* FROM (SELECT "users"."name" AS name, "exhibits"."name" AS xname, "exhibits"."ssn" AS number FROM "users" INNER JOIN "exhibits" ON "exhibits"."user_id" = "users"."id") test0s  WHERE "test0s"."number" < 20]
            Test0.where{number < 20}.count.should == 20
        end
    end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在没有支持表的情况下在 Rails 中创建只读模型 的相关文章

  • 如何创建下载链接

    创建下载链接的最佳方法是什么 还有比下面更好的方法吗 我正在考虑使用link to Download controller gt action gt id gt 视图中 Adding match documents download id
  • 使用 Rails 应用程序推送到 Heroku 时如何忽略文件夹和文件?

    我有一个Rails 3 2 8应用程序 我不想推送我的spec文件夹和test登录 Heroku 我该怎么做 如果有一个staging偏僻的 Thanks 你可以把它们放进去 gitignore 但这会将它们从您的整个存储库中排除 更好的解
  • Rails 中的代码片段应该放在哪里?

    我有这个代码片段 可以为 POST 生成签名 它的细节并不重要 但我想知道的是 由于它不是与模型相关的代码块 所以它确实可以在任何地方使用 在控制器中 在模型中 在视图助手中 即使在视图中 因此 我不确定在哪里 甚至更大的问题是 一旦将其放
  • 供用户使用的 Rails 模型结构

    我是 Rails 新手 正在开发我的第二个 Rails 应用程序 该应用程序将为用户提供不同的角色 但某些用户将具有多个角色 该网站的每个用户都将是艺术家 一些用户将担任主持人的角色 我将如何构建这个 在我使用的一些 PHP 应用程序中 只
  • Capybara::ElementNotFound:无法找到字段“标题”

    我无法解决这个问题 请帮我 它给了我找不到元素的错误 规格 功能 todos create spec rb require spec helper describe Creating todos do let user FactoryGir
  • 从 Ajax 调用时不渲染布局

    我有一个名为 index 的 Rails 操作 它可以呈现页面的内容以及布局 当我使用浏览器执行 index 操作时 它的工作方式与预期一致 我还希望能够通过使用 Ajax 调用此操作来呈现此操作 我使用以下命令来执行此操作 jQuery
  • 没有路线匹配 [GET]“user/sign_out”rails 5

    我目前使用 Devise 遇到此错误 并且我已经尝试了其他问题中的多种方法 以便以零运气解决它 首先建议我确保将该方法添加为删除 No luck 然后我被建议我需要在我的布局标题中包含以下内容 or this 还是 运气不好 最后 建议我更
  • 如何使用哈希数组填充 select_tag?

    在 Rails 3 2 应用程序中 我尝试添加一个选择字段 该字段从外部 API 调用获取数据 该数据作为哈希数组返回 name gt NameA id gt 001 name gt NameB id gt 002 我如何使用这些数据来构造
  • 如何在Rails中管理没有id的表?

    我有两个模型 人模型和关系模型 第二个存储有关两个人之间关系的信息 它有parent id和child id字段 但没有id字段 我将它与 has many through 连接起来并且它有效 But 即使表中存在某些关系 因为没有 id
  • Rails:使最终用户可以编辑视图?

    无论如何 我可以使最终用户可以编辑 Rails 视图中的内容吗 这样他们就可以在我允许的页面上进行简单的文本更改 而无需我自己编辑 HAML 文件 想法 澄清 我了解 CMS 系统 但我认为这并不完全是我想要的 我想保持对视图的编程控制 但
  • Jquery 条件适用于除 safari 之外的所有浏览器

    在 iPhone 和 iPad 上的 Safari 中 我为条件语句设置的选择器不起作用 并且会导致每个 ajax 请求出现重复的内容 它在 android chrome firefox ie 和桌面版 safari 上运行良好 li mi
  • 未使用 form_with 显示时出错

    早上好 我正在按照教程进行操作http edgeguides rubyonrails org getting started html http edgeguides rubyonrails org getting started html
  • Rails 5.2 Active Storage 添加自定义属性

    我有一个带有附件的模型 class Project lt ApplicationRecord has many attached images end 当我附加并保存图像时 我还想保存一个附加的自定义属性 display order 整数
  • 按共同关联的数量排序 (Rails)

    背景 我有帖子和用户 并且都有很多社区 客观的 对于任何给定的用户 我想返回一个帖子集合 按该帖子与该用户有共同社区的数量排序 具有更多共同社区的帖子位于更高的位置 我当前的尝试 使用排序方法 有效 Post includes commun
  • Active Record 和 DAO 之间的区别?

    数据访问对象和 Active Record 之间有什么区别 它们看起来非常相似 因为都在应用程序和持久层之间构建了一个层 并使用 SQL 查询抽象出直接数据库访问 数据访问对象 DAO 是指数据层中负责在域中保存单独实体的对象 Active
  • 在所有延迟的作业之前挂钩

    是否可以在所有delayed job任务之前运行一个方法 基本上 我们试图确保每台运行delayed job的服务器都有我们代码的最新实例 因此我们希望运行一个方法来在每个作业运行之前检查这一点 我们已经有了 check 方法并在其他地方使
  • 从 Rails 2.3.8 升级到 4.0

    我正在 Rails 2 3 8 上运行一个应用程序 我计划将其升级到 Rails 4 0 RC 版 对我来说最简单的方法是什么 我需要先升级到 Rails 3 x 吗 注意 在我当前的实现中 我使用八哥和雪貂 作为升级的一部分 我也在考虑搬
  • Rails 上的 SASS 无效 CSS 错误

    我正在尝试使用http startbootstrap com stylish portfolio http startbootstrap com stylish portfolio但是 在我的 Rails 应用程序中 我在 vintage
  • 初始化会破坏rails中的布局设置吗?

    在其中一个控制器中 我需要特定的布局 我添加了layout一开始 效果很好 但如果我添加一个initialize某些基于控制器的变量的函数 Rails 似乎只是忽略了layout命令 有人有同样的问题吗 我该如何修复它 class Admi
  • 使用 PostgreSQL 的模式和 Rails 创建多租户应用程序

    我已经想通的事情 我正在学习如何在 Rails 中创建多租户应用程序 该应用程序根据用于查看应用程序的域或子域来提供来自不同模式的数据 我已经回答了一些问题 如何让 subdomain fu 也能与域一起使用 这是有人问了同样的问题 htt

随机推荐

  • Jenkins 无法从项目文件夹运行 xcodebuild

    我正在尝试为 iOS 应用程序设置 CI 环境 到目前为止 我已经让 xcodebuild 从命令行正确构建测试版本 但是当 Jenkins 尝试执行它时 我在控制台中得到以下读数 Started by user anonymous Bui
  • 更新了 AutoMapper,现在收到未映射的属性异常

    我有以下映射 Mapper CreateMap
  • 使用 ubuntu 和 postgresql 启动 pgpool 后 pid 文件消失

    我已经在 ubuntu 12 04 上使用 pgpoolII 3 3 3 和 pgPoolAdmin 安装了 postgresql 9 1 如果我尝试使用 sudo pgpool 从终端运行 pgpool 它似乎会启动 查看 ubuntu
  • 使用 mongo csharp 插入后如何获取最近插入的文档的 _id?

    我能够使用以下代码成功插入新文档 但无法获取新插入文档的 id 插入后 user 为空 谢谢你 MongoServer server MongoServer Create MongoDatabase test server GetDatab
  • 将回收者视图中显示的选中复选框的项目保存在列表中

    我设法显示存储在房间数据库中的项目recycler view with checkboxes我想将选中的项目存储在列表中 将选中的项目存储在我使用的列表中setOnClickListener在适配器中的复选框上 如下面的代码 但当我单击显示
  • 在修改 numpy 数组时使用省略号

    我看到了下面的代码here https www tutorialspoint com numpy numpy iterating over array htm 它尝试迭代 numpy 数组 arr 并修改其元素 但是 我不太明白这里使用省略
  • GNU 链接器映射文件给出意外的加载地址

    我正在开发一个嵌入式程序 其中有一个自定义链接器脚本 该程序可以工作 但我注意到链接器在内存中放置几个 部分的方式可能有问题 以下是链接描述文件的相关部分 MEMORY ROM rx ORIGIN 0x00100000 LENGTH 16k
  • C++ 11:智能指针的使用[重复]

    这个问题在这里已经有答案了 使用 smart 的最佳实践是什么 在某些情况下我应该更喜欢使用原始指针而不是智能指针 例如 如果我知道 A 类创建了 B 类并且是 B 类的唯一所有者 是否有理由使用智能指针 如果您知道有关该主题的任何好文章
  • 核心数据问题 - 检查项目是否存在

    我正在研究 NSScreenCast 的一个代码示例 该示例涉及导入到核心数据应用程序 link https github com nsscreencast 012 importing into core data 我的例子大部分都有效 我
  • 如何在.Net Framework 4.8中引用.Net 6.0 dll

    今天是个好日子 我有一个针对 Net Framework 6 0 的类库项目 当我将此 dll 引用到另一个面向 Net Framework 4 8 的项目时 我收到以下错误消息 我会感谢你的帮助 简短的回答是 你不能 NET 6 和 Ne
  • 如何将Python数组(data = [])写入Excel?

    我正在编写一个 python 程序来处理 hdf 文件 我想将此数据输出到 Excel 电子表格 我将数据放入数组中 如下所示 Code data for rec in hdfFile data append rec 从这里我创建了一个 9
  • 通过并行处理,使程序能够由不同的线程同时发送邮件

    我有下面的程序 它使用 java mail api 发送邮件 现在这是我开发的简单程序 我现在想通过使用 executorframework 来修改并行执行 我希望 5 个不同的线程独立地触发我的这个程序但这 5 个不同的线程应该同时触发
  • 长轮询与 Websockets [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我开始开发一个软件 使用 html js 编码的应用程序 我需要从服务器 java 代码 发送此应用程序通知 该应用程序使用 nginx 进行路
  • 如何在生产模式下运行 maven/eclipse/GWT/playN 应用程序?

    如果您想使用以下过程在生产模式下从 Eclipse 启动 playN GWT maven 应用程序 似乎会出现问题 右键单击 playn showcase html 并选择 Goolge GWT 编译 Compiling module pl
  • 在 HTML 中隐藏输入有什么意义?这有哪些常见用途?

    我没有看到隐藏输入的好处 如果您设置隐藏输入的值 为什么不在引用该隐藏输入的位置使用该值呢 这是有原因的 但我只是不知道 它们用于传递提交表单时所需的数据 更常见的情况之一是允许用户编辑某些现有条目的表单 您需要知道他们正在编辑哪个条目 以
  • 使用 HttpURLConnection 发送 UTF-8 字符串

    到目前为止 我已经使用以下代码片段来发送和接收 JSON 字符串 static private String sendJson String json String url HttpClient httpClient new Default
  • 未捕获错误:ReCAPTCHA 占位符元素必须是元素或 id

    我正在将 ReCAPTCHA 添加到具有多个联系表单的 Bootstrap Jekyll 网站 页脚中有一个弹出模式 偶尔有一个 立即联系我们 部分 还有几个页面上有一个 请求有关 的更多信息 由于我在一个页面上有多个联系表单 因此我需要显
  • 将 Python 最小化到系统托盘并生成通知? [复制]

    这个问题在这里已经有答案了 我环顾四周 但找不到任何可以接近做我想做的事的东西 我想让我的 Python 脚本作为最小化的系统托盘应用程序启动 或者能够最小化到系统托盘 并且能够发出系统托盘通知 有人有任何想法 库或示例吗 谢谢 海福莱克斯
  • 从 Swift 中的 Eureka Forms 获取值

    我是 Swift 编程新手 我正在尝试使用 Eureka 库创建一个表单 该表格已经可以使用 但我无法从表格中获取数据 我试图将数据一一存储到全局变量中 以便在按下按钮时打印 问题是代码总是被破坏 我不知道如何纠正它 这是我的代码 impo
  • 如何在没有支持表的情况下在 Rails 中创建只读模型

    我想创建只读模型 这可能是一些复杂的结果 与任何直接表模型类关系不大的联接或聚合查询 我已经定义了 例如想象中的 ActiveRecord View 类 class B lt ActiveRecord View default scope