如何通过尚未保存的父关联访问 ActiveRecord 祖父母关联?

2024-01-08

我有一种情况,我想在保存父对象之前访问关联的祖父母。我可以想到几种技巧,但我正在寻找一种干净的方法来完成此任务。以下面的代码来说明我的问题:

class Company < ActiveRecord::Base
  has_many :departments
  has_many :custom_fields
  has_many :employees, :through => :departments
end
class Department < ActiveRecord::Base
  belongs_to :company
  has_many :employees
end
class Employee < ActiveRecord::Base
  belongs_to :department
  delegate :company, :to => :department
end

company = Company.find(1)           # => <Company id: 1>
dept = company.departments.build    # => <Department id: nil, company_id: 1>
empl = dept.employees.build         # => <Employee id: nil, department_id: nil>

empl.company   # => Employee#company delegated to department.company, but department is nil

我正在使用 Rails 3.2.15。我明白这里发生了什么,我也明白为什么 empl.department_id 为零;尽管我希望 Rails 在调用 save 之前保留对预期关联的直接引用,以便最后一行可以通过未保存的部门对象进行委托。有干净的解决办法吗?

更新:我也在 Rails 4 中尝试过这个,这里是一个控制台会话:

2.0.0-p247 :001 > company = Company.find(1)
  Company Load (1.5ms)  SELECT "companies".* FROM "companies" WHERE "companies"."id" = ? LIMIT 1  [["id", 1]]
 => #<Company id: 1, name: nil, created_at: "2013-10-24 03:36:11", updated_at: "2013-10-24 03:36:11"> 
2.0.0-p247 :002 > dept = company.departments.build
 => #<Department id: nil, name: nil, company_id: 1, created_at: nil, updated_at: nil> 
2.0.0-p247 :003 > empl = dept.employees.build
 => #<Employee id: nil, name: nil, department_id: nil, created_at: nil, updated_at: nil> 
2.0.0-p247 :004 > empl.company
RuntimeError: Employee#company delegated to department.company, but department is nil: #<Employee id: nil, name: nil, department_id: nil, created_at: nil, updated_at: nil>
2.0.0-p247 :005 > empl.department
 => nil 

更新2:这是一个github上的测试项目 https://github.com/dissolved/activerecord_deep_obj_linking.


请查看:inverse_of选项belongs_to http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to and has_many http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many。在不同情况下构建和获取关联记录时,此选项将处理双向分配。

From 双向关联 http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Bi-directional+associations for ActiveRecord::Associations::ClassMethods在文档中:

指定:inverse_of关联选项可以让您告诉 Active Record 有关反向关系的信息,并且它将优化对象加载。

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

如何通过尚未保存的父关联访问 ActiveRecord 祖父母关联? 的相关文章

随机推荐

  • 是否可以在 React 的 useEffect 中使用自定义钩子?

    我有一个非常基本的自定义挂钩 它接受路径并从 firebase 返回文档 import React useState useEffect useContext from react import FirebaseContext from s
  • 在抛出异常时中断捕获的异常

    在 VS 调试器中 未捕获的异常会导致程序在抛出异常时 或足够接近 中断 并处于一种允许您查看该点之前的所有堆栈帧和局部变量的状态 有没有办法获得相同的结果 抛出时中断 但在特定点捕获异常 我对对所有异常甚至给定类型的所有异常执行此操作不感
  • FFT - 计算频率仓之间的精确频率

    我在用我在网上找到的一个不错的 FFT 库 http www corix dk Mix FFT mix fft html看看我是否可以编写一个音高检测程序 到目前为止 我已经能够成功地让库对包含一些正弦波的测试音频信号进行 FFT 计算 其
  • 从 python 内部触发 catkin 构建过程

    我正在编写一个 python 脚本来组织一个由多个存储库组成的项目 一些目标是使用catkin构建的 由于catkin是一个python工具 我怀疑必须有一种方法来调用等效的catkin build来自 python 脚本 然而 我正在努力
  • 在自定义指令中模拟 v-if 指令

    我需要销毁 v if 等自定义指令中的元素 如果条件失败 则禁止创建项目 我尝试这个 export const moduleDirective DirectiveOptions DirectiveFunction el binding vn
  • 如何使用 MailMessage 在 powershell 电子邮件中嵌入图像

    我有一封可以在 PS 上使用的电子邮件 我一直在尝试做的是将图像嵌入到电子邮件中 而不是附件 以下是我到目前为止所拥有的 function Email smtpServer smtp server smtpFrom email from s
  • 1969 年 12 月 31 日晚上 7:00 发生了什么

    每次在 PHP 中创建一个如下变量时 date strtotime row date date date M d Y a t g i A date Mmm dd YYYY at h mm PM AM 不知何故row date 恰好是 0 日
  • C# 将 string,int,string 存储在可访问变量中

    我需要保存一个包含静态国家 地区列表的类以进行缓存 数据是用 string shortName Primary Key IL or UK for example int ID Unique has no meaning but needs
  • 离子造型 2 吐司

    有什么方法可以在 ionic 2 toast 中设置文本消息的样式吗 我已经尝试过这个 let toast Toast create message Some text on one line br br Some text on anot
  • Qt 有没有办法强制 QMediaPlayer 缓冲文件而不播放它?

    当您将文件加载到QMediaPlayer例如 它不会自动缓冲文件 这MediaStatus遗迹NoMedia直到您使用播放文件play 只有在此之后它才会最终成为BufferedMedia 我在文档中找不到任何方法来强制播放器缓冲文件而不播
  • 对 ASP.Net Web 应用程序的 App_Code 进行单元测试

    我想创建一个 ASP Net Web 应用程序 并且想为其编写单元测试 但我的单元测试项目看不到我的 Web 应用程序的 App Code 目录中的任何类型 重现步骤 如果您已经知道如何创建默认的 Webforms Web 应用程序并添加
  • 从以管理员身份运行的进程中以用户身份启动进程

    我想从以管理员身份运行的程序启动另一个以用户身份运行的程序 问题是第二个程序需要使用outlook 如果程序以管理员身份运行则不可能 主程序需要以管理员身份运行 我确实已经想出了这两个解决方案 Process Start cmd exe C
  • 通过 NavDeepLinkBuilder 的 PendingIntent 发送参数

    我在通过电子邮件发送论点时遇到一些困难PendingIntent的通知使用NavDeepLinkBuilder 我能到达目的地Activity通过单击通知来启动 但是Activity s Intent不包含我通过它传递的参数值NavDeep
  • 从 Django 应用程序添加 URL

    我想从我在 settings py 中添加的 Django 应用程序添加 URL我尝试过添加urls py希望它能起作用 但事实并非如此 因为它只读取项目 项目 urls py并不是项目 应用程序 urls py 如何让应用程序添加网址 U
  • 尝试在 mac osx lion 上运行 mongodb 时出现错误“错误:无法连接到服务器 127.0.0.1 shell/mongo.js”

    我正在使用 Mac OS X Lion 我刚刚使用 macports 全新安装了 MongoDB 当我第一次尝试运行 mongodb 时 出现以下错误 MongoDB shell version 2 0 5 connecting to te
  • Rails 5,“nil 不是有效的资产源”

    我刚刚升级到 Rails 5 在尝试显示图像时遇到了一个奇怪的问题 我有 Rails 4 的确切代码 但升级后我得到 nil is not a valid asset source 在升级到 Rails 5 之前 我没有任何类似的问题 这里
  • 通过 WCF REST 传递验证异常

    我正在使用 WCF 和 REST 并且有复杂的类型 但运行良好 现在我需要检查验证 我正在考虑使用 DataAnnotations 例如 public class Customer Required public string FirstN
  • PHPcurl 返回奇怪的字符

    我正在尝试使用 Prestashop 实例的图像产品更新页面 我正在使用 prestashop 网络服务获取信息 问题是当我加载页面时 它会询问我 prestashop 的令牌 密钥 但我想使用我通过 CURL 传递的 Url 和密钥保存登
  • DOM 更改时的 JavaScript 事件监听器 [重复]

    这个问题在这里已经有答案了 我正在编写一个 Mozilla Firefox 扩展 Javascript 无需识别它是 IE 还是 Firefox 我发现自己陷入了以下情况 在页面加载时 我添加事件侦听器 如下所示 extension add
  • 如何通过尚未保存的父关联访问 ActiveRecord 祖父母关联?

    我有一种情况 我想在保存父对象之前访问关联的祖父母 我可以想到几种技巧 但我正在寻找一种干净的方法来完成此任务 以下面的代码来说明我的问题 class Company lt ActiveRecord Base has many depart