Rails 中是否可以有复合外键?

2024-02-16

假设以下数据模式:

Usage
======
client_id
resource
type
amount

Billing
======
client_id
usage_resource
usage_type
rate

在此示例中,假设我有多个资源,每个资源都可以通过多种方式使用。例如,一个资源是widget. Widgets can be fooed,他们可以是bared. Gizmo也可以是fooed and bar编辑。这些使用类型按不同的费率计费,甚至可能针对不同的客户采用不同的费率。每次使用(资源)的发生都记录在使用表中。每个计费费率(针对客户端、资源和类型组合)都存储在计费表中。

(顺便说一句,如果这个数据模式不是解决这个问题的正确方法,请提出建议。)

是否可以使用 Ruby on Rails 和 ActiveRecord 创建一个has_many从账单到使用情况的关系,以便我可以获得给定账单费率的使用实例列表?是否有语法has_many, :through我不知道吗?

再次,我可能从错误的角度处理这个问题,所以如果你能想到更好的方法,请大声说出来!


显然,sourceforge 有一个项目来扩展 Rails 的 ActiveRecord,支持复合主键 http://compositekeys.rubyforge.org/。我没有使用过这个扩展,但它可能对你有帮助。它也是 ruby​​forge 上的一颗宝石。

从版本 2.0 开始,Plain Ruby on Rails 不支持复合主键(参见 2.0)。如何使用旧模式 http://wiki.rubyonrails.org/rails/pages/howtouselegacyschemas)。每个表必须有一个名为“的单列自动增量键”id".

我看到的解释是:“如果您想使用旧数据库,则只需要复合主键。”这当然是对数据建模的一种可笑的无知观点。

我看到的解决方案是:

  • 使用.client_id -> Client.id
  • 使用情况.type_id -> 使用情况类型.id
  • 使用.resource_id -> 资源.id
  • Billing.usage_id -> 使用情况.id
  • Billing.client_id -> Client.id
  • Billing.type_id -> 使用类型.id
  • Billing.resource_id -> Resource.id

明显多余的外键Billing尝试强制执行部分引用完整性。但它并没有完全实现这一目标——它并不能阻止你在Billing引用一行Usage客户端/资源/使用类型组合错误,与计费表中引用行中的组合不匹配。

edit:@Yarik:是的,你是对的。这更有意义Usage参考Billing.

  • 使用情况.billing_id -> 计费.id

唔。我制作了 ER 图,但在将其作为图像插入时遇到问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 中是否可以有复合外键? 的相关文章

  • 如何自定义 Mailboxer 电子邮件的模板?

    它会自动发送电子邮件 其中写着 You have a new message subject You have received a new message Body Visit http example com and go to you
  • 如何从模型调用辅助方法?

    我使用 MongoDB 作为我的 Rails 应用程序中的数据库和 MongoID gem 我想从模型中调用辅助方法after create回调方法 这怎么可能 我的模型代码是 class Department include Applic
  • Mongoid 命名范围比较同一文档中的两个时间字段

    我需要在 Mongoid 中创建一个命名范围来比较同一文档中的两个时间字段 例如 scope foo where gt updated at gt gt checked at 这显然不会像它对待的那样起作用 checked at作为一个符号
  • Ruby on Rails 中的三重连接

    我对 Ruby on Rails 中的关联有疑问 应用程序中有项目 用户 角色和组 项目属于一个有用户的组 一个用户可以属于多个不同的组 但只能在该组中拥有一个特定的角色 例如 在一个组中 用户是项目所有者 但在另一个组中 他是作家 使用
  • 在 Rails 6 上定义 Secret_key_base 的正确方法是什么?

    正确的定义方式是什么secret key base既然我们已经有了每个环境的凭据 就可以在 Rails 6 上使用了吗 我的环境有变量SECRET KEY BASE但 Rails 并没有接受它 我尝试定义secret key base in
  • 有很多数据库视图可以吗?

    我很少 每月 每季度 使用 Microsoft SQL Server 2005 数据库视图生成数百份 Crystal Reports 报告 在我不读取这些视图的所有时间里 这些视图是否会浪费 CPU 周期和 RAM 因为我很少从视图中读取数
  • Ruby on Rails - 设计注册链接不起作用 - 未定义方法“user_registration_path”

    这个问题之前已经报告过 但我仍然无法找到解决方案 我已将插件 Devise 安装到我的新 RoR 项目中 当我点击注册链接时 我被重定向到以下路线 http localhost 3000 users registration sign up
  • Rails 4 i18n,如何转换子域用于区域设置的路由

    我正在使用子域来确定 Rails 4 网站中的区域设置 我完全按照我想要的方式使用区域设置切换器 但现在我需要翻译路线 并且我不确定继续的最佳方法 我看过https github com kwi i18n routing https git
  • Mongoid 中的 find_or_create_by 线程安全吗?

    我有一个使用 Mongoid 的 find or create by 方法的网络应用程序 poll Poll find or create by fields 在投入生产之前 我尝试运行故障场景 我发现多个用户可以尝试使用此方法访问此资源
  • 多态控制器和调用对象

    我的地址具有多态关系 可以由成员或依赖者拥有 一切看起来都很棒 直到我意识到除非我遗漏了一些东西 否则我不知道创建它的对象是什么类型 有没有办法告诉路由文件包含对象的类型 Models class Member lt ActiveRecor
  • Rails 注释分段错误

    有一些问题围绕着这个问题 但没有什么真正能满足我的需求 After I bundle install下面列出了我的 Gemfile 我运行annotate并出现以下错误 Users nickcoelius rvm gems ruby 1 8
  • 从 Ruby 中的 DateTime 变量获取时间

    我在 ruby 中工作 我有一个包含数据库中今天的日期时间的对象 我只想要时间截断数据 我怎样才能得到那个 Try 日期时间 strftime http www ruby doc org stdlib 1 9 3 libdoc date r
  • 使用 Ajax 在输入时提交 Textarea,然后渲染部分内容而不刷新整个页面

    目前我正在尝试通过 JS 和 Ajax 在没有提交按钮的情况下发表评论 并且它有效 问题是当帖子提交时 页面重新加载到 post id comment页面 我希望它呈现部分内容 而不是刷新整个页面或将我带到不同的页面 我对 JS 不熟悉 任
  • 将 Rails 变量传递给液体可以在控制台中工作,但不在视图中

    我想将哈希传递给渲染方法 当我这样做时 在我的控制台中一切正常 object Object find params id hash object object to liquid template Liquid Template parse
  • Capistrano 和 XSendFile 配置

    我正在尝试使用 Apache 2 2 Passenger 4 0 59 和 XSendFile 0 12 配置 Rails 生产服务器 应用程序通过 Capistrano 部署 部署的应用程序生成 可能很大 PDF Rails root t
  • Rails 3 + angularjs + 缩小在生产中不起作用:未知提供者:eProvider

    我已遵循我能找到的所有修复缩小的说明 例如 var MyController function renamed scope renamedGreeter MyController inject scope greeter and someM
  • 如何在 Rails 4 中使用 params.require

    我有一个像这样的私有方法 用于有四个字段的注册表单 firstname email password and confirm password 我不知道如何检查password confirmation def user params pa
  • 如何从 Rails 中的 date_select 或 select_date 获取日期?

    Using select date给我回一个params my date with year month and day属性 如何轻松获取 Date 对象 我希望有类似的事情params my date to date 我很高兴使用date
  • 如何在 Rails 测试中测试 params 哈希?

    以下内容会生成错误 未定义的局部变量或方法 params assert equal params recipient id users one id 如何测试参数哈希 另外 你如何测试assert redirect当存在参数时 参数附加到
  • Rails 控制台无法运行

    rbenv 红宝石版本 2 6 6 导轨版本 5 1 4 我正在较旧的代码库中工作 ruby 2 6 6 rails 5 4 1 这是我每天使用的代码库 我必须通过 rbenv 下载一个新的 ruby 版本作为单独的存储库 这样做在我的旧代

随机推荐

  • 如何在 Qt 中设置适用于 Windows 的应用程序版本?

    When my application crashes the Windows Event Viewer always reports my application version as 0 0 0 0 I can t figure how
  • 访问第三方库中的 web.config 文件

    我正在编写一个 IHttpFilter 它需要位于一个单独的项目 这些都是 C 项目 中 以便在一组 ASP NET MVC 应用程序中使用 在 IHttpFilter 中 我必须确定 web config 文件中指定的一些内容 有没有办法
  • jQuery 追加元素(如果不存在),否则替换

    这是一小段代码 var el something find test if el length something append div class test somecontent div else el replaceWith div
  • 从 C 调用 PHP

    我正在尝试编写一个使用 PHP 作为脚本语言的应用程序 该应用程序是一个 CGI 处理程序 我希望能够从中调用 PHP 页面 我正在寻找可以让我在 C 程序中初始化 PHP 的代码 然后向其传递包含 php 代码的缓冲区或文件名 以供其解析
  • 数据库选项:为什么默认情况下“SET ANSI_NULLS OFF”对于新数据库是关闭的?

    使用 SSMS 2014 当我使用 SSMS 创建新数据库时 新数据库的默认设置有一些奇怪的地方 ALTER DATABASE del SET ANSI NULL DEFAULT OFF GO ALTER DATABASE del SET
  • 汇编器 64b 除法

    我需要一些简单的方法来在 x86 的汇编器中除以 64b 无符号整数 我的号码保存在两个 32b 寄存器 EDX EAX 中 我需要将结果放回 EDX EAX 因数为 32b 整数 请给一些代码 如果我正确解释你的问题 特别是这部分Fact
  • 发送 AVAudioRecorder 到服务器 iOS

    在过去的几天里 我试图将本地保存的声音记录上传到服务器 该服务器使用 php 文件处理它并将其保存到服务器 问题是我找不到办法做到这一点 录制声音 AVAudioRecorder 时 它保存在 NSTemporaryDirectory 中
  • 如何生成一个字符重复n次的字符串?

    我可以使用下面的代码来生成一个字符串 awk e BEGIN for i 1 i lt 10 i s s x print s xxxxxxxxxx 但它的复杂性与字符串长度是超线性的 time awk e BEGIN for i 1 i l
  • 标记未在子视图 IOS SWIFT 的谷歌地图中定位

    你好 我试图将地图放入子视图中 但是当我将谷歌地图放入子视图中时 它无法工作 标记和 GPS 坐标也无法工作 With Sub View Without Sub View SWIFT代码 import UIKit import Google
  • CMake 中的绝对路径与相对路径

    我一直在尝试构建一个简单的 C 库 在使用相对路径构建的过程中 CMake 无法正确配置我的链接库所在的位置 使用绝对路径配置成功 这是让我放弃使用 CMake 的一些原因之一 设置路径的推荐方法是什么 是绝对路径还是相对路径 为什么 gi
  • 如何在 Delphi 中递归创建文件夹?

    在创建可以通过给定路径递归创建文件夹的函数时需要一些帮助 C TestFolder Another AndAnother Delphi 函数 MkDir 返回 IOerror 3 MkDir C TestFolder Another And
  • 将证书从驱动程序导入 TrustedPublisher 以进行静默驱动程序安装

    我想安装 Balloon 驱动程序以在 KVM 中运行 Windows 无需用户任何交互 静默安装 我使用 powershell 将驱动程序中的证书提取到某个临时文件 然后使用 certutil exe 将其导入到 TrustedPubli
  • 在元素之间移动鼠标太快时的 jQuery 悬停问题

    我在页面上多次重复以下 html div class outer outer div class inner inner div div 并有这个 jQuery inner hide outer hover function e this
  • clang-tidy 配置中没有等效的“-line-filter”?

    我想配置我的 line filter 中的论点 clang tidy文件而不是生成命令的 cmake 源文件中 添加一个LineFilter文件的密钥只会给我一个 未知密钥 错误 这真的不支持通过配置文件吗 还有其他选择吗 不幸的是 这不受
  • 如何将 CSS 引用添加到 .NET SyndicatedFeed?

    我创建了一个包含许多 Syndicates 的简单 SyndicatedFeed 每个 SyndicateItem 都有 HtmlContent HtmlContent 是一个表 这显示正常 但现在我需要在桌子上添加最少的样式 填充 我相信
  • 将 Oracle 数据库从一台 PC 转移到另一台 PC 的最简单方法是什么?

    我想把我的oracle数据库转移到另一台电脑上 最简单的方法是什么 有没有 GUI 工具可以做到这一点 APC 的答案是逻辑传输的方法 如果您询问是因为您只想一次性传输到另一台电脑 那么 安装相同版本的Oracle 第二台电脑 创建相同的目
  • 当更改视图的模型时,是替换模型更好还是创建新视图更好?

    我的 Backbone 应用程序中有一个电子邮件视图 它目前在中实例化view我的控制器的动作 它有点像这样 routes email id email email function id var email new Email id id
  • Android 嵌入式网络服务器

    我想在我的 Android 应用程序中嵌入一个网络服务器 连接到它的设备将具有两种功能 一个是发送一个 xml 文件 我可以解析该文件并执行一些操作 另一个是能够从我的 SD 卡下载文件 我找到了 nanoHTTPD 和 AndroidHT
  • Linux 上的 mysql2 gem 安装

    我正在尝试在 Linux 上安装 gem 但它给了我一个错误 An error occured while installing mysql2 0 3 11 and Bundler cannot continue Make sure tha
  • Rails 中是否可以有复合外键?

    假设以下数据模式 Usage client id resource type amount Billing client id usage resource usage type rate 在此示例中 假设我有多个资源 每个资源都可以通过多