ruby on rails

使用模型关联可能很困难。

在构建模拟Central Perk和Ruby on Rails应用程序时。 has_manybelongs_to关系是有意义的,但是通过关系的多对多has_many through关系是很奇怪的地方。

在构建应用程序时遇到了几个问题,这就是我解决问题的方式。

模型行为

对于我的项目,我计划使用三种模型:用户(咖啡师),订单和菜单项(产品)。 一个用户可能有很多订单。 属于用户的订单可能有许多菜单项

使用这些模型,我希望能够以编程方式执行以下操作:

  • 创建一个新订单并自动将其与用户关联。 shannon.orders.create
  • 能够查看属于用户的所有订单。 shannon.orders
  • 请按特定顺序查看所有MenuItem(产品)。 order.menu_items

设置好模型之后,一切似乎都可以正常运行,直到order.menu_items为止。 当前,具有menu_items属性的Order只能有一个值。 意思是,每个订单一个 MenuItem。 您是否可以想象是否必须重新排队并为要在咖啡店购买的每种商品重新订购?

罗斯和瑞秋看上去很困惑

这是一个has many through关系的地方。

多对多

如果每个订单我想要多个MenuItem,则order.menu_items的结果必须是一个数组。 这是四个OrderItem模型出现的地方。

OrderItem充当OrderItem表,并带有OrderMenuItems模型的外键。 在此示例中,考虑到每个OrderItem记录都有一个事务实例,一次代表一个Order和一个MenuItem

订单本质上是具有相同order_id的所有OrderItem记录的集合。 我离弄清楚我需要什么又走了一步。

但?

首先,使用OrderItem模型是有意义的。

直到没有。

我需要调用order.order_items.menu_items才能查看该订单中的所有商品吗? 我的应用程序也有一个User模型。 当模型超过三个时,如何通过关系构建has_many?

Pheobe到处喊着“我该怎么办?”

实际上,has_many through仅适用于三种模型。 但是,通过其他关联,它扩展了那些模型的功能。 如果我想知道一个特定用户创建的一阶user.orders.first.menu_items.count我可以这样称呼: user.orders.first.menu_items.count

在视觉上,我认为这四个模型之间的关系如下所示:

通过用户,订单(包含OrderItems)和菜单项之间的关系可视化has_many

这很有道理!

我不需要直接引用OrderItems 。 ActiveRecord对我有用。 由于Order有许多OrderItems ,因此引用Order将使我直接访问MenuItems

我的最终模型现在看起来像这样:

class User < ApplicationRecordhas_secure_passwordhas_many :orders
endclass Order < ApplicationRecordbelongs_to :userhas_many :order_itemshas_many :menu_items , through: :order_items
endclass OrderItem < ApplicationRecordbelongs_to :orderbelongs_to :menu_item
endclass MenuItem < ApplicationRecordhas_many :order_itemshas_many :orders , through: :order_items
end

参数

完成关联后,我需要一个表单来创建Order对象。 一开始,一切似乎都在进行。 但是在仔细查看控制台之后,我意识到事务正在回滚并且订单没有保存到数据库中。

我注意到:menu_items_id键已在我的强参数中列出,但是我遇到了“ :menu_items_ids不允许错误”。

为了尝试解决此问题,我在控制台中进行了工作,一点一点地进行了测试,直到可以查明卡住的位置。 在控制台中,我可以成功执行以下操作。

  • 创建一个订单。 order = Order.create(user_id: 1, name_for_pickup: "Rachel", menu_item_ids: [1,2,3])
  • 查看order上menu_items的值order.menu_items // [1,2,3]
  • 将商品添加到订单中order.menu_items << item
  • 保存订单order.save

然后打我。

Rails正确地不允许menu_item_ids参数。 我以为我需要创建一个订单。 相反,我需要创建一个订单, find the menu items by id (menu_items_id, which was the unpermitted param) and shovel them into the array

我从这里更新了我的创建订单方法:

def create@order = Order.create(order_params)if @order.saveredirect_to order_path(@order)elserender :newend
end

对此

def create@order = Order.create(order_params)items_to_add = params[ :order ][ :menu_item_ids ]items_to_add.each do |item_id|if item_id != ""item_id = item_id.to_iitem_to_add = MenuItem.find_by_id(item_id)@order.menu_items << item_to_addendendif @order.saveredirect_to order_path(@order)elserender :newendend

而且有效!

钱德跳上咖啡桌,做着快乐的舞蹈

得到教训

总之,如果遇到对象关系问题,请尝试以下操作:

验证参数正确

错别字会立即导致对象创建失败。 诸如menu_item_idmenu_item_ids类的复数形式也值得关注。 所有参数都是字符串 ,如果期望整数或布尔值,则可能会导致下游影响。

所有模型属性均以强参数列出

强大的参数有助于防止用户通过表单将有害数据注入到您的数据库中。 如果强参数只能在User模型中提交:name:email:password ,则如果:not_a_hacker的属性在您的参数之内,则事务将失败(并且不会写入数据库,是的!)。

使用.create! 测试时

create! 将提供更多信息,说明哪些验证可能导致错误。 例如,在我的应用中, Order必须具有关联的User (barista)user_id。 在控制台中运行Order.create()不会告诉我太多,但是运行Order.create!()会打印出错误,例如“用户必须存在”

将'.valid?'附加到对象

对象可能正在更新,但是它是否正确保存到数据库中? 例如,如果order = Order.create() (一个空对象,因为没有:user_id ,它将不生效),然后添加.valid? 将返回false。

摘要

模型关联可能很困难且令人沮丧,但并非不可能。 通过一些仔细的调试,您可以立即成为模型关联的大师。

资源资源

  • 什么是Rails参数以及如何正确使用它们
  • 活动记录协会

安妮·斯普拉特 Annie Spratt) Unsplash 拍摄的 照片

先前发布在https://shannoncrabill.com/blog/ruby-on-rails-debugging-model-associations/

翻译自: https://hackernoon.com/debugging-has_many-through-relationships-in-ruby-on-rails-a65s366p

ruby on rails

ruby on rails_通过Ruby on Rails中的关系调试Has_Many相关推荐

  1. 在Ruby on Rails中对nil v。空v。空白的简要解释

    我发现自己一再寻找nil?差异的明确定义nil? , blank? , empty? 在Ruby on Rails中. 这是我最接近的: blank? 对象是false,空或空白字符串. 例如, &q ...

  2. ruby on rails_最终的中级Ruby on Rails教程:让我们创建一个完整的应用程序!

    ruby on rails 由Domantas G (By Domantas G) There are plenty tutorials online which show how to create ...

  3. Ruby DSL介绍及其在测试数据构造中的使用(2)

    在(1)中介绍了DSL和普通的函数定义之间的区别.在(1)的最后提到,DSL分为内部DSL和外部DSL,我们再看一遍他们的定义:1. External DSLs 用不同于host语言的语言来编写,通过 ...

  4. ruby on rails_DB2和Ruby on Rails入门

    ruby on rails Ruby on Rails于2004年发布,已Swift成为Web应用程序开发中最流行的框架之一. 这个开源项目也称为Rails或RoR,它使用模型-视图-控制器(MVC) ...

  5. ruby oracle数据,从 Ruby on Rails 连接到 Oracle

    开发人员:Ruby on Rails 从 Ruby on Rails 连接到 Oracle 作者:Obie Fernandez 了解如何从一个 Rails 应用程序连接到 Oracle 和与其相关的验 ...

  6. rails db 查询优化_如何优化查询以解决Rails中常见的可伸缩性瓶颈

    rails db 查询优化 by Usama Ashraf 通过Usama Ashraf 如何优化查询以解决Rails中常见的可伸缩性瓶颈 (How to optimize your queries ...

  7. Rails中的使用者验证:Devise

    Rails中的使用者验证:Devise 概要:Devise是Ruby On Rails的一个三方权限认证组件,通过它可以无需编码快速生成一个带有登陆,注册.权限认证和重置密码的认证模块. 安装: 1. ...

  8. rails 中的respond_to 对不同的文件要求给予相应

    通过上一讲,我们已经对REST on Rails的基本框架有所了解,但是它是如何实现根据客户端的请求类型来返回不同类型的资源表示的呢?这就是我们这一讲所要讲的,秘密就在于respond_to. 首先让 ...

  9. 第一个Ruby程序,Hello Ruby

    安装Ruby完成后,环境变量已经自动配置好了,可以直接进入到命令行下检查一下是否正确的安装了,输入ruby -v 如果返回了一串字,只要带着ruby就表示安装成功了,哈哈 ruby 2.4.1p111 ...

  10. 在Rails中撤消脚手架

    有没有办法在Rails中"撤消"脚手架命令的效果? #1楼 第一次,如果您已生成脚手架,则可以检查数据库迁移. 你必须销毁它们来清理你的数据库 rake db:rollback 然 ...

最新文章

  1. 【rnnoise源码分析】biquad滤波器
  2. 大数据导论之为何需要引入大数据
  3. (操作系统)实验二 作业调度
  4. 华为OJ: 公共字符串计算
  5. linux 编译指cpu内核,linux内核编译与配置
  6. 【OJ】洛谷顺序结构题单题解锦集
  7. Unity3D-RayMarch-几何图元1-添加基本着色模型
  8. 虚拟化桌面初始化配置处理
  9. 风控算法知识——浅谈信息熵与IV值应用介绍
  10. python-ImageDraw
  11. Java练手项目(好玩又有趣)
  12. Python3 Cobalt strike shellcode 免杀过 360 卫士和360杀毒
  13. sqlserver 提示“用户sa 登录失败 18456”问题解决过程
  14. 试验Windows Embedded Standard 7 Service Pack 1 Evaluation Edition
  15. 微软遥测服务服务器,使用 .REST 配置 Azure 媒体服务遥测 | Microsoft Docs
  16. Java项目:SSM实现的一个在线文具学习用品购买商城网站
  17. 最全 | 全国31个省市区重点产业布局
  18. 小米电视怎么下载软件?用一起看TV宅家不无聊
  19. 超级计算机应用于石油勘测等方面,算天算地 算人——国家超级计算天津中心主任刘光明解读超级计算机系统应用(二)...
  20. 高端游戏开发工具:Unity Pro 2019 Mac版

热门文章

  1. ActivityManagerService解读之Activity启动三探--Activity中Task与Stack
  2. python 相关系数矩阵_用numpy计算Pearson相关系数
  3. SIP软电话开发的基本条件和要点
  4. [知乎]这可能是最全面的龙芯3A3000处理器评测
  5. 时间管理——永远做重要不紧急的事情
  6. 计算机培训excel的制作,绵阳电脑excel表格制作教程
  7. Mysql 免安装配置
  8. pm2 启动 nodejs 项目
  9. QML 编译release 报错: qmlcache_loader.cpp:-1: error: undefined reference to `__imp__ZN11QQmlPrivate13qml
  10. 怎样压缩图片大小到20k?教你一键压缩图片大小