【问题标题】:Implicit Tables in Ruby on RailsRuby on Rails 中的隐式表
【发布时间】:2009-05-30 09:35:58
【问题描述】:

我刚刚学习如何使用 Ruby on Rails 进行编程,Ruby on Rails 框架为您所做的工作给我留下了深刻的印象。我有以下两个类:

Object
--------
object_id
description

ObjectGroup
--------
group_id 
description

我的想法是我有一些对象,我希望用户能够定义对象组。对象行和对象组行都有自己的标识符和关联数据,这基于网络上发布的文档非常直观。我的问题是 - 我如何存储有关构成 ObjectGroup 的对象的信息并充分利用 Ruby on Rails 框架?在 SQL 中执行此操作的明显方法是使用第三个表,该表存储以下形式的条目:

ObjectGroupEntry
--------
object_id
group_id

ObjectGroupEntry 表中的每个条目都代表一个属于 ObjectGroup 的对象。我是否有责任手动创建此表并教与 Objects 和 ObjectGroups 交互的类如何与之交互?或者 Ruby on Rails 是否提供了一些我还没有发现的魔法?

我可以自己做这件事,但我仍在学习 Ruby on Rails,我想学习正确的方法 (TM) 来做这件事。

【问题讨论】:

  • 请注意,实际创建一个名为 Object 的类可能不是一个好主意。这可能会产生相当大的影响......
  • 同意,这只是一个例子。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

在 Rails 中,两者兼而有之。您使用具有正常命名约定的迁移(或其他方法)创建表,然后在 Object 和 ObjectGroup 的模型中放入以下行:

==Object==
has_and_belongs_to_many :object_groups

==ObjectGroup==
has_and_belongs_to_many :objects

只要您在 ObjectObjectGroup 表中没有任何额外信息,那么这就是您所需要的。否则,您将需要一个新模型,但可能会获得相同的行为:

==Object==
has_many :object_object_groups
has_many :object_groups, :through => :object_object_groups

==ObjectObjectGroup==
belongs_to :object
belongs_to :object_group

==ObjectGroup==
has_many :object_object_groups
has_many :objects, :through => :object_object_groups

使用 :through 属性指示 has_many 关系以获得多对多关系并允许访问有关该关系的其他信息。

【讨论】:

  • 正常的命名约定是什么?您可以将 ObjectObjectGroup 重命名为 ObjectGroupList 吗?对不起,我很容易混淆。 :)
  • itsignals.cascadia.com.au/?p=7 用于命名约定。您可以提供自己的表格和模型等并覆盖约定,但这(故意)比一开始就遵循约定要做更多的工作,而且我从不费心记住如何去做:)
【解决方案2】:

我想你会发现它是

has_many :object_object_groups
has_many :objects, :though => :through => :object_object_groups

而不是 workmad3 所说的。提供的所有其他信息都是正确的,只是语法错误。

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 2012-01-18
    • 1970-01-01
    • 2012-05-12
    • 2015-08-14
    • 2017-08-03
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多