0

我正在做我的第一个 rails(3) 应用程序。

协会没有意义。首先,即使是导轨指南也没有真正解释它们的作用,它们只是解释了如何使用它们。据我所知,协会做了两件事:

    a) Allow ActiveRecord to optimize the structure of the database.
    b) Allow ActiveRecord to offer an alternate ruby syntax for
       joins and the like (SQL queries). I want this.

我正在尝试了解关联,以及如何正确使用它们。根据下面的示例,似乎关联已“损坏”,或者至少文档已损坏。

考虑我的应用程序的一个简单版本。一位老师修改单词表以供学习。

本次讨论有 3 个相关表格。为清楚起见,我只是简单地包含了 annotate(1) 工具对表的定义,并删除了不必要的字段/列。

词表管理表:

    Table name: wordlist_mgmnt_records
    id         :integer         not null, primary key
    byline_id  :integer(8)      not null

将单词映射到单词列表的表:

    Table name: wordlists
    wordlist_mgmnt_id :integer         not null
    word_id           :integer         not null

我们实际上并不关心单词本身。但我们确实关心最后一张表,即署名:

    Table name: bylines
    id           :integer(8)      not null, primary key
    teacher_id   :integer         not null
    comment      :text            not null

署名记录谁,使用什么工具,在哪里,何时等。署名主要用于解决发生的事情,以便我可以向用户解释他们应该做什么(和/或修复他们的错误)。

教师可以一次修改一个或多个单词列表管理记录(也称为单个署名)。换句话说,一次更改可能会更新多个单词列表。

对于 wordlist_mgmnt_records 关联将是:

    has_many :bylines       # the same byline id can exist
                            # in many wordlist_mgmnt_records

但是署名的相应条目是什么?

《Beginning Rails 3》(Carneiro 等人)一书说:

    "Note: For has_one and has_many associations, adding a belongs_to
    on the other side of the association is always recommended. The
    rule of thumb is that the belongs_to declaration always goes in
    the class with the foreign key."

[ 是的,我也为此查看了在线导轨指南。没有帮助。]

对于署名表/课程,我真的想说吗?

    belongs_to :wordlist_mgmnt_records

这真的没有意义。bylines 表基本上属于数据库中具有 bylines_id 的每个表。那么我真的会说属于他们所有人吗?那不会在所有其他表中设置外键吗?这反过来又会使更改比我真正想要的更昂贵(太多的 CPU 周期)。一些变化影响了很多表,其中一些非常大。我重视正常使用的速度,并且愿意等待在使用署名进行清理/修复时找到没有外键的署名。

这给我们带来了完整的循环。关联在 Rails 中的真正作用是什么,如何巧妙地使用它们?

仅仅因为你可以使用关联似乎不是正确的答案,但是你如何获得添加的连接语法呢?

4

1 回答 1

0

我会尽力解决你的困惑......

一个署名可以有多个wordlist_mgmnt_records,所以定义has_many那里似乎是有意义的。

我不确定我是否理解您在另一个方向上的困惑。由于您已经定义了属性wordlist_mgmnt_records.byline_id,因此任何给定wordlist_mgmnt_record的都只能“拥有”(belong_to)一个署名。您只是通过 ruby​​ 定义鱼尾纹(如果您喜欢数据库图):

wordlist_msgmnt_records (many)>>----------(one) byline

或者用英文阅读:“一个署名可以有许多 wordlist_mgmnt,许多单独的 wordlist_mgmnt 可以属于一个署名”

将 belongs_to 定义添加到 wordlist_mgmnt 模型不会影响查询的性能,它只是让您执行以下操作:

@record = WordlistMgmntRecord.find(8)
@record_byline = @record.byline

此外,您还可以对以下表进行连接:

@records = WordlistMgmntRecord.joins(:byline).where({:byline => {:teacher_id => current_user.id}})

它将执行此 SQL:

SELECT wordlist_mgmnt_records.*
FROM wordlist_mgmnt_records
INNER JOIN bylines
  ON wordlist_mgmnt_records.byline_id = bylines.id
WHERE bylines.teacher_id = 25

(假设current_user.id返回 25)

这是基于您当前的数据库设计。如果您发现有一种方法可以实现您想要的功能而无需在表中byline_id作为外键,wordlist_mgmnt_records那么您将修改您的模型以适应它。然而,这似乎是规范化数据库的外观,我不确定你会采取什么其他方式。

于 2011-06-16T23:14:46.520 回答