回答

收藏

在Rails 3在单个记录中使用多个外键?

技术问答 技术问答 293 人阅读 | 0 人回复 | 2023-09-14

我正在开发一个将管理注册课程的学生的应用程序。该应用程序将有用户可以登录和操作学生。用户也可以评论学生。因此,我们的三个主要班级是学生、用户和评论。问题是,我需要将个人评论与其他两个模型联系起来:用户和学生。所以我从这样的基本代码开始…
/ q! s: z% q( xclass Student 因此,在注释表中,单个记录将具有以下字段:2 |( v* w# n3 e; z! j
idcommentstudent_iduser_idcreated_atupdated_at这带来了几个问题。首先,用来创造关联对象的美丽Rails语法会分解。要发表新的评论,必须在外键之间进行选择。…; v; G, E2 X' O. ]
User.comments.create(attributes={})或者6 @& [7 B( `2 w& U
Student.comments.create(attributes={})另一种选择是随意选择外键,然后手动添加到attrs哈希中…& G" W9 K1 x+ d9 r. c* C. [2 x! m7 n
User.comments.create(:comment => "Lorem ipsum",:student_id => 1)这个选项的问题是我必须在我身上Comment模型中的attr_accessible下列出student_id。但我的理解是,这将带来安全风险,因为有些人可以使用大量的技术分配来重新联系其他学生。
/ k) E  b2 \* I8 P5 d2 r) x+ L; v这就导致了另一个通常使用的问题Rails数据建模问题。我现在在Rails几年前我第一次在中间构建应用程序PHP /  e: Q* ]9 M0 j0 S0 c: a- L9 |8 R  X
MySQL编写的应用程序。当我第一次学习的时候SQL当时,我们非常重视标准化的想法。因此,例如,如果您有一个存储姓名和地址的联系人表,您将使用许多外部关系来避免重复数据。如果你有一个状态列,你就不想直接列出状态。否则,你可能有成千上万的行,包括
! o5 n6 n+ Y* a" K* JTexas等等。最好有一个单独的状态表,并使用外部关系将其与您的联系人表相关联。SQL理论的理解是,任何可能重复的值都应该分为自己的表。当然,为了完全标准化数据库,你最终可能会contacts表中有许多外键。(state_id,gender_id等)) i% `; F+ g! U/ @1 s# d$ f5 R
所以,如何用 Rails如何实现这一目标?
2 W0 W1 K+ M; e# x. j2 q" r1 g( H为了澄清(对不起,我知道已经很久了),我考虑了另外两种常见的方法: has_many:through
; o5 c, ^# z4 o% _9 Z=>与多态关联。据我所知,这两种方法都不能解决上述问题。原因如下:
& }: o) e: T9 k  X# Z3 C6 e$ c; Dhas_many:through=>效果很好。因此,我们有注释、文章和用户模型。用户在文章中有很多评论。(对了,这样的例子出现了Apress的BeginningRails3.好书。)问题是要有效(如果我没记错的话),每篇文章都必须属于特定的用户。在我的情况下(这里Student模型类似于Article),没有一个用户拥有一个学生。因此,我不能说用户在学生中有很多评论。可能有多个用户评论同一个学生。
0 o4 T! |' H) }! J- _( w最后,我们有多态关联。假设没有一个记录需要属于一个以上的外部类别,这对多个外部键非常有用。RailsCasts第154集中,Ryan8 D) J; N3 n- G9 ~. v& G
Bates给出一个可能属于文章、照片或事件的示例。但是,如果一个评论需要多个评论,该怎么办?
0 R" L$ [: T3 Q) M7 D因此,总之,我可以手动分配一个或两个外键User,Student,Comment场景正常工作,但无法解决attr_accessible的问题。
1 C& S: w+ B4 Q) ^2 J首先感谢您的任何建议!* f+ K& X: i' x* O% r7 j. e
                                                               
  [4 \8 d. H; j- P2 v* I: A2 ?. e$ I    解决方案:                                                                8 F% o& a( I9 s& F1 f* J! d
                                                                当我开始使用它时Rails我遇到了你的确切问题。如何确保正确association_ids在保护的同时,在create方法中整齐地设置两个关联。
, ?0 L: Y3 [7 y* I9 B, KWukerplank是正确的-您不能通过批量分配设置第二个关联,但您仍然可以直接在新行中分配association_id。" H& F4 ^6 M4 J# V4 t1 }4 m; x+ W, U, Z, T
这种关联分配很常见,在我的代码中很乱,因为在很多情况下,一个对象有多个关联。: ^3 ~" P: \+ C/ o
另外,要明确:多态关联和has_many:through根本解决不了你的情况。你有两个独立的联系(评论的所有者和评论的主题)-它们不能合理化为一个。
8 q4 U+ G' X6 h% E! F1 K编辑:这就是你应该做的:
2 ^0 l' Z! T4 `* K/ _# D@student = Student.find_by_id(params[:id])@comment = @student.comments.build(params[:comment]) #First association is set here@comment.user = current_user #Second association is set hereif @comment.save  # ...else  # ...end通过使用Object.associations.build,Rails会自动创建一个新的“关联”对象,并在保存时将其与Object关联。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则