Rails 5 如何在多个共享属性的表之间形成关联

2023-11-24

在 Rails 5 中,给定两个表之间的关系涉及在多个共享属性上连接它们,我如何在与这些表对应的模型之间形成关联?

SQL:

SELECT *
FROM trips
JOIN stop_times ON trips.guid = stop_times.trip_guid AND trips.schedule_id = stop_times.schedule_id

我尝试了以下配置,一般情况下有效......

class Trip < ApplicationRecord
  has_many :stop_times, ->(trip){ where("stop_times.schedule_id = ?", trip.schedule_id) }, :inverse_of => :trip, :primary_key => :guid, :foreign_key => :trip_guid, :dependent => :destroy
end

class StopTime < ApplicationRecord
  belongs_to :trip, :inverse_of => :stop_times, :primary_key => :guid, :foreign_key => :trip_guid
end

Trip.first.stop_times.first #> StopTime object, as expected
Trip.first.stop_times.first.trip #> Trip object, as expected

...但是当我尝试在更高级的查询中使用它时,它会触发ArgumentError:关联范围“stop_times”取决于实例(范围块采用参数)。不支持预加载实例相关范围。...

Trip.joins(:stop_times).first #=> the unexpected ArgumentError
StopTime.joins(:trip).first #> StopTime object, as expected

我了解错误所引用的内容,但我不确定如何修复它。

EDIT:

我希望一个协会就足够了,但有人指出两个不同的协会可以完成这项工作:

class Trip < ApplicationRecord
  has_many :stop_times, 
              ->(trip){ where("stop_times.schedule_id = ?", trip.schedule_id) }, 
              :primary_key => :guid, 
              :foreign_key => :trip_guid # use trip.stop_times instead of trip.joined_stop_times to avoid error about missing attribute due to missing join clause

  has_many :joined_stop_times, 
            ->{ where("stop_times.schedule_id = trips.schedule_id") },
            :class_name => "StopTime",
            :primary_key => :guid,
            :foreign_key => :trip_guid # use joins(:joined_stop_times) instead of joins(:stop_times) to avoid error about instance-specific association
end

Trip.first.stop_times
Trip.eager_load(:joined_stop_times).to_a.first.joined_stop_times # executes a single query

如果阅读本文的人知道如何使用单个关联,请提及我。


我认为这不是正确的解决方案,但它可以提供帮助。您可以添加另一个类似的实例独立关联,该关联仅用于预加载。它将与:joins and :eager_load但不与:preload.

注意:includes可能在内部使用:eager_load or :preload. So, :includes不会总是与该协会合作。您应该明确使用:eager_load反而。

class Trip < ApplicationRecord
  has_many :preloaded_stop_times, 
           -> { where("stop_times.schedule_id = trips.schedule_id") },               
           class_name: "StopTime", 
           primary_key: :guid, 
           foreign_key: :trip_guid
end

# Usage
trips = Trip.joins(:preloaded_stop_times).where(...)
# ...

# with :eager_load
trips = Trip.eager_load(:preloaded_stop_times)

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

Rails 5 如何在多个共享属性的表之间形成关联 的相关文章

随机推荐

  • Android 应用内结算的官方国家/地区列表? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 您好 我目前在巴基斯坦 当我启动 Google 示例应用内结算应用程序时 它说 无法购买 市场 计费服务不可用 这次 您可以继续使用 这个应用程序
  • 如何配置 Devise for Ruby on Rails 将电子邮件和密码存储在用户模型之外的其他位置?

    我想将电子邮件存储在单独的表中 并允许用户保存多封电子邮件并使用其中任何电子邮件登录 我还想将密码存储在不同的表中 如何配置 Devise 将身份验证信息存储在其他地方 最坏的情况是 如果我必须侵入它 是否有一个生成器可以将所有内容移植到应
  • 锁定自定义选项卡的方向

    我想使用 Chrome 自定义选项卡锁定方向 这是我可以使用低级 API 完成的事情还是我需要为此功能添加新方法 我的用例是 我有一个具有自定义选项卡的应用程序 我希望它始终以纵向显示自定义选项卡 而不是横向显示 自定义选项卡当前不提供允许
  • 从设置中获取动态属性

    我的 AppConfig 中存储了一些属性 现在我想动态访问它们 例如在循环或函数中 使用 MySettings NAME OF THAT THING 访问值没有问题 但如果名称是变量怎么办 I tried String propertyV
  • 如何沿 axis=1 进行 DataFrame.groupby

    I have df pd DataFrame A 1 2 3 B 1 2 6 df A B 0 1 1 1 2 2 2 3 6 问 我如何获得 A 0 1 1 2 2 1 5 using groupby and aggregate 就像是
  • 使用值数组将 numpy 分组为多个子数组

    我有一系列沿直线的点 a np array 18 56 32 75 55 55 我有另一个数组 它对应于我想用来访问 a 中的信息的索引 它们始终具有相等的长度 两个数组都没有a也不数组b已排序 b np array 0 2 3 2 2 2
  • 警告:openssl_pkcs7_sign() [function.openssl-pkcs7-sign]:在第 8366 行的 C:\xampp\htdocs\this\tcpdf\tcpdf.php 中获取私钥时出错

    我正在使用 TCPDF 来签署 PDF 但是在运行时实施例52我收到这个错误 Warning openssl pkcs7 sign function openssl pkcs7 sign error getting private key
  • 为什么循环要分配最后一个索引元素的引用? [复制]

    这个问题在这里已经有答案了 我想为我的所有标签添加一个事件侦听器 每个传递一个对其自身的引用作为触发事件时的参数 这是我写的函数 function validateDigitsFeature Add the event listeners
  • Bootstrap 模式使滚动条在关闭后消失

    我在 StackOverflow 上读到了很多关于这个主题的解决方案 技巧 但似乎没有一个对我有用 我正在使用模式登录 Meteor 例如使用 Facebook 登录服务 并在登录成功时触发回调 我将其放在回调中以关闭模式 modalSig
  • Web 驱动程序卷曲异常

    尝试使用Codeception Web Driver和Selenium通过验收测试来模拟ajax 我正在使用 PhpBrowser 但当我遇到 Ajax 问题时 我的朋友建议使用 WebDriver 启用它并下载 selenium 并运行它
  • 接口作为参数或泛型方法与 where - 有什么区别?

    之间有什么区别 public void Method1
  • 静态方法中的全局变量

    这看起来很基本 但我发现这很微不足道 简而言之 您建议如何使用静态类 即控制台应用程序 设置全局变量 为了给您更多背景知识 主要方法是调用一些自定义事件处理程序 我希望它们能够获取 设置变量 如果您有任何想法或建议 我们将不胜感激 最简单的
  • Doctrine2:如果不选择至少一个根实体别名,则无法通过标识变量选择实体

    我被一个原本非常简单的学说 2 查询困住了 我有一个名为 Category 的实体 它与其自身具有 OneToMany 关系 对于父类别和子类别 ORM ManyToOne targetEntity Category inversedBy
  • 使用 Foreach 子句的 Lambda 表达式 [重复]

    这个问题在这里已经有答案了 可能的重复 为什么 IEnumerable 接口上没有 ForEach 扩展方法 EDIT 作为参考 这是埃里克在评论中提到的博客文章 https ericlippert com 2009 05 18 forea
  • 从 Excel 到 R 的日期,平台依赖性

    我正在导入xls文件使用gdata 我正在使用转换日期列as Date转换日期 根据手册as Date 日期来源取决于平台 因此我正在确定相应地使用哪个来源 origin lt ifelse Sys info sysname Windows
  • 从 arraybuffer 显示 pdf

    我从这段代码中返回来自 laravel dompdf 的流数据 pdf App make dompdf wrapper pdf gt loadHTML div This is test div return pdf gt stream 这是
  • 如果为 null 或为空,则不插入字段

    我有一个带有一些字段的 C 类 其中一些字段为空 那些为空的我不想将其插入到具有空值的数据库中 我根本不想将它们插入数据库 我该如何实现这一目标 class User public string FirstName public strin
  • HTML 文件上传字段样式

    我正在尝试创建一个具有一点风格的文件上传字段 但我似乎在查找此类示例时遇到问题 我知道部分原因是该字段本身因浏览器而异 有什么想法如何做到这一点 或者有没有一种方法可以在不使用可设置样式的表单的文件元素的情况下执行此操作 如果您的意思是文件
  • 在react-admin中访问redux store

    我的问题与反应管理 repo 我想在组件范围之外分派一个操作 以便做到这一点 我读过我需要访问实际的 redux 存储本身 并直接调度 所以我知道Admin组件有一个initialStateprop 但它只接受默认状态对象 而不接受存储 所
  • Rails 5 如何在多个共享属性的表之间形成关联

    在 Rails 5 中 给定两个表之间的关系涉及在多个共享属性上连接它们 我如何在与这些表对应的模型之间形成关联 SQL SELECT FROM trips JOIN stop times ON trips guid stop times