【问题标题】:Ruby on Rails - Models and Relationship TableRuby on Rails - 模型和关系表
【发布时间】:2011-10-05 21:08:42
【问题描述】:

我是一个从 ruby​​ on rails 开始并试图理解模型的菜鸟。非常熟悉数据库并想了解何时为关系生成模型?

例如 - 我有用户表和小工具表。每个用户都可以拥有多个小工具。我想将此关系存储在具有 user_id 和 gadget_id 的关系表中。我已经使用 rails generate model User 和 rails generate model Gadget cmd 创建了这两个表。

问题 - 我现在要创建另一个名为 users_gadgets 的模型吗?命名约定是否正确?我看过很多关于如何创建关联(has_many、belongs_to)的文档,但不明白什么时候需要创建模型?

每次我想在数据库中存储关系然后运行我的迁移时,我是否必须创建模型?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    您可以通过以下两种方式之一进行操作

    1) has_and_belongs_to_many 在这种情况下,您只需要一个带有 user_id gadget_id 的表(无模型)gadgets_users,rails 喜欢表名按字母顺序排列

    2) has_many :through,这不是“正常”有很多,在这种情况下你需要一个模型(可以任意命名) 我更喜欢这个而不是另一个,因为它允许您在需要时向关系添加其他属性

    看指南,它比我能解释的更好http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many

    还有 - railscasts - http://railscasts.com/episodes/47-two-many-to-many

    每次我想在数据库中存储关系然后运行我的迁移时,我是否必须创建模型?是的,大多数时候

    【讨论】:

    • 谢谢house9!为了给你更多的背景信息,我习惯于直接在 mysql 中创建表,然后编写我的代码。所以设置模型有点混乱。对于#1,我是否直接在 mysql 中创建表?
    • @coutdark 我认为你最好使用迁移,它可以帮助非常轻松地创建表。
    【解决方案2】:

    我发现考虑这一点最有用的方法是考虑与应用程序逻辑相关的模型和与数据相关的表。比如说你的用户有一个名字和一个身高和体重。这些是用户的属性,并存储在表中。它们可以通过模型的属性访问。但用户也可能有根据身高和体重计算的体重指数。这是模型的一种方法,但只是与数据库间接相关。

    就个人而言,我总是会为数据库表创建模型。这样做更容易,可以更轻松地编写干净的 ruby​​ 代码而无需大量 SQL 语句,并且如果在将来的某个时候您想向模型中添加逻辑,这很容易做到。

    【讨论】:

      【解决方案3】:

      关系模型仅对您描述的 N 对 N 关系有意义。当您选择使用 has_and_belongs_to_many 时,您不需要创建连接模型,但您仍然需要通过迁移创建连接表。命名约定为 gadgets_users,因为字母表中“g”在“u”之前。

      如果您选择 has_many :through,您可以通过 GadgetUser 连接模型将附加信息存储在连接表中。例如,如果您想记录某个小工具在给定时间内属于某个用户,那么该时间信息在逻辑上属于小工具和用户之间的“连接”,因此您应该将其保存在联接表中。

      【讨论】:

        【解决方案4】:

        安装 gem安装外国人

        将以下行添加到 gem 文件中

        gem '外国人'

        之后查看以下链接

        https://github.com/matthuhiggins/foreigner

        【讨论】:

        • 在可能的情况下,请尽量包含您引用的任何外部链接的摘要。这样一来,如果将来链接失效,至少会保留一些有用的信息,而不会全部丢失。
        猜你喜欢
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-24
        • 1970-01-01
        相关资源
        最近更新 更多