首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >第一个has_many是冗余的吗?- Ruby on Rails活动记录关联

第一个has_many是冗余的吗?- Ruby on Rails活动记录关联
EN

Stack Overflow用户
提问于 2016-02-05 19:19:41
回答 2查看 220关注 0票数 0

Rails 4.2新手:

2个问题;

1)第一个has_many是否冗余?因为它的名字是Save Class的复数?

我只能拥有:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
has_many   :savers, through: :saves, source: :saver

甚至更好;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
has_many   :savers, through: :saves

如果答案是肯定的,我可以在哪里设置"dependent::destroy"?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Post < ActiveRecord::Base
  belongs_to :user
  has_many   :saves, class_name: "Save", foreign_key: "saver_id", dependent: :destroy                        
  has_many   :savers, through: :saves, source: :saver
end

class Save < ActiveRecord::Base
  belongs_to :saver, class_name: "User"
  validates :saver_id, presence: true
end


class User < ActiveRecord::Base
  has_many :posts, dependent: :destroy
  ...
end

2)这是一个典型的博客模型,用户可以将另一个用户发布的帖子‘保存’到他们的时间线上。此模型是否使用了最佳实践?特别是在数据库性能方面,通过连接来获取用户保存的帖子。将有100 The行的“保存”表?

EN

回答 2

Stack Overflow用户

发布于 2016-02-07 20:06:22

首先,让我们稍微修改一下您的示例,以减少命名的混乱:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class User
  has_many :bookmarks
  has_many :posts, through: :bookmarks
end

class Post
  has_many :bookmarks
  has_many :users, through: :bookmarks
end

class Bookmark
  belongs_to :user
  belongs_to :post
end

让我们看一下在执行@user.posts时生成的查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
irb(main):009:0> @user.posts
  Post Load (0.2ms)  SELECT "posts".* FROM "posts" INNER JOIN "bookmarks" ON "posts"."id" = "bookmarks"."post_id" WHERE "bookmarks"."user_id" = ?  [["user_id", 1]]
=> #<ActiveRecord::Associations::CollectionProxy []>

现在让我们注释掉has_many :bookmarks并重新加载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class User
  # has_many :bookmarks
  has_many :posts, through: :bookmarks
end

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
irb(main):005:0> @user.posts
ActiveRecord::HasManyThroughAssociationNotFoundError: Could not find the association :bookmarks in model User

所以不,第一个has_many并不是多余的--事实上,它是has_many through:工作原理的核心。您通过另一个关系设置了一个排序快捷方式。

请注意,在has_many :posts, through: :bookmarks :bookmarks中,我们正在连接的是名称关系。而不是包含联接的表。

要修复原始代码,您需要执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Post < ActiveRecord::Base
  has_many   :saves, dependent: :destroy             
  has_many   :savers, through: :saves
end

class Save < ActiveRecord::Base
  belongs_to :saver, class_name: "User"
  belongs_to :post # A join table with only one relation is pretty worthless.
  validates :saver_id, presence: true
end

class User < ActiveRecord::Base
  has_many :posts 
  has_many :saves, dependent: :destroy
  has_many :posts, through: :saves
end

请注意,您不需要一半的垃圾-如果您有has_many :savers, through: :saves,ActiveRecord将查找关系saver本身。此外,您只想在连接模型上使用dependent: destroy -而不是在post关系上,因为这会删除用户“保存”的所有帖子-甚至是其他人写的帖子!

票数 1
EN

Stack Overflow用户

发布于 2016-02-06 22:24:16

我自己教Rails,我想学习使用框架的专业方法和遵循Rails指南的最佳实践。这并不容易,因为我通常会找到“有效”的答案。

我会试着自己回答,也许这对Rails新手有用:

使用保存通过,关联,Rails首先通过查看<class>_id形式的外键来推断关联,其中<class>是类名的小写,在本例中为‘has_many _id’。

因此,如果我们有列名'save_id',我们将有以下简化的模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Post < ActiveRecord::Base
  belongs_to :user                      
  has_many   :saves, through: :saves
end

class Save < ActiveRecord::Base
  belongs_to :savers, class_name: "User"
  validates :save_id, presence: true
end


class User < ActiveRecord::Base
  has_many :posts, dependent: :destroy
  ...
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35231839

复制
相关文章
Koa/Express+TypeScript扩展类型
在我们使用Koa或者Express进行开发时会经常使用中间件进行访问权限过滤或者属性加工,很多时候我们需要把中间件的属性传递给下一个路由函数,但是因为TS类型的限制我们无法直接获取扩展的元素或者无法获取正确的类型。本文讲解了在使用Koa/Express+TypeScript开发时如何扩展中间件上的属性。
用户6256742
2022/07/11
8280
Koa/Express+TypeScript扩展类型
TypeScript入门——扩展类型之枚举
在上一篇文章中聊到了很多TS基础类型,那为什么又出现了扩展类型枚举,我们都知道任何东西都不是平白无故就出现的,都是为了解决特定的问题。枚举只是扩展类型其中之一,比如说还有类型别名,接口,类
程序员法医
2022/08/11
9970
TypeScript入门——扩展类型之枚举
TypeScript系列教程四《扩展类型》
TypeScript 最好玩的应该就是类型系统,随意组合创造,提供基础联合类型、交叉类型,还有一系列的高级函数可以玩转类型。
星宇大前端
2021/07/19
1.1K0
TypeScript系列教程四《扩展类型》
《现代Typescript高级教程》扩展类型定义
在 TypeScript 中,我们可以通过声明文件(.d.ts 文件)来为现有的 JavaScript 库提供类型定义,或者为现有的类型添加额外的属性和方法。这个过程通常被称为“类型声明扩展”。在这篇文章中,我们将详细探讨如何通过声明文件扩展类型定义。
linwu
2023/07/27
6110
TypeScript中的类型
基本类型布尔类型 (boolean)布尔类型表示一个值为真或假的逻辑值。let isDone: boolean = false;数字类型 (number)数字类型表示整数或浮点数。let count: number = 10;let price: number = 3.99;字符串类型 (string)字符串类型表示一串字符。let message: string = "Hello, TypeScript!";数组类型 (array)数组类型表示一个元素的集合。let numbers: number[] =
堕落飞鸟
2023/05/22
1.9K0
TypeScript 在 Vue2 中的类型声明问题
最近在一个新项目中,尝试了vue2+typescript的组合,碰到一个问题,在data属性中,我怎么声明一个变量的类型。
2022/02/25
4.7K0
TypeScript中的类型断言
本文是关于 TypeScript 中的 type assertions 的,它与其他语言中的类型强制转换有相似之处,并通过 as 运算符执行。
疯狂的技术宅
2020/06/19
3.8K0
实现TypeScript中的互斥类型
有这样一个对象,它有两个属性:name与title,在赋值的时候这两个属性只有一个能出现,例如:name出现的时候title就不能出现,title出现的时候name就不能出现。
神奇的程序员
2022/04/11
3.1K0
实现TypeScript中的互斥类型
TypeScript 中的数组类型定义
在 TypeScript 中声明和初始化数组也很简单,和声明数字类型和字符串类型的变量也差不多,只不过在指定数组类型时要在类型后面加上一个中括号 []
Qwe7
2022/03/19
5.4K0
【TypeScript 演化史 -- 8】字面量类型扩展 和 无类型导入
在我上一篇更好的类型推断的文章中,解释了 TypeScript 如何用 const 变量和 readonly 属性的字面量始化来推断字面量类型。这篇文章继续讨论这个,扩展和非扩展字面量类型之间的区别。
前端小智@大迁世界
2022/06/15
1K0
【TypeScript 演化史 -- 8】字面量类型扩展 和 无类型导入
Typescript 中,这些类型工具真好用
你是否曾经用 TypeScript 写代码,然后意识到这个包没有导出我需要的类型,例如下面这段代码提示 Content 在 @example 中不存在:
前端修罗场
2023/10/07
2180
Typescript 中,这些类型工具真好用
Typescript中的复杂类型声明
Typescript为javascript加入了众多类型声明语法,灵活使用可使代码变得健壮,不严谨的类型声明会带来后期的维护麻烦。本篇假设读者已经学会ts的基础类型声明语法,包括type、interface、extends和泛型,在此基础上,聊一聊一些更加复杂的类型声明场景以及解决办法。
腾讯IVWEB团队
2020/06/28
7.2K1
03-TypeScript中的强类型
在js中不能定义类型,而是根据赋值后,js运行时推断类型。在ts中支持强类型,强类型包括string、number(浮点型,不是整型)、boolean、any(任意类型)、Array<T>、自定义类型(枚举、类等) 除了能给变量申明为强类型,参数也可以申明为强类型,方法也可以定义返回类型,方法如果没有返回值,定义为void类型。 var username:string; var age:number; var descrption:any; var isman:boolean; var schools:Ar
用户1910585
2018/05/04
1.9K0
PHP中Redis扩展无法加载问题
phpredis编译出来的redis.so也需要拷贝到"/usr/lib64/php/modules/"中;
叫我可儿呀
2019/11/16
2K0
TypeScript 类型保护
这时就需要用到类型保护,类型保护允许你使用更小范围下的对象类型,常见的类型保护如下:
Leophen
2020/08/05
7190
TypeScript 类型保护
TypeScript 类型系统
针对 JavaScript 上面的问题,聪明的同学就想那我们就给 JavaScript 加个类型吧,和 Java 一样,能够对变量的类型进行定义,这个想法就是 TypeScript 的类型系统, 在很大程度上弥补了 JavaScript 的带来的困惑。
HoneyMoose
2021/11/16
8570
TypeScript 类型系统
TypeScript函数类型
通过如下代码我们实现了一个返回值为number类型的方法,同时我们也对返回值和参数进行了约束
HueiFeng
2020/04/09
7560
TypeScript函数类型
通过如下代码我们实现了一个返回值为number类型的方法,同时我们也对返回值和参数进行了约束
HueiFeng
2020/04/10
7920
TypeScript 类型系统
TypeScript 的学习资料非常多,其中也不乏很多优秀的文章和教程。但是目前为止没有一个我特别满意的。原因有:
lucifer210
2020/08/20
1.4K0
TypeScript 类型系统
点击加载更多

相似问题

TypeScript在扩展语法函数调用中无法推断数组类型

21

在Typescript中扩展泛型类型

141

无法在TypeScript中扩展快速请求

434

在Typescript中扩展外部类型声明

110

在TypeScript中扩展特定类型的数组

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文