如何组织此表,以便可以访问它,具体取决于访问它的对象的类型

时间:2011-11-23 04:43:28

标签: ruby-on-rails database-design

enter image description here

我有这个表,其中包含一个名为'icon_for'的字段,我一直用它来检查图标是否可用于'用户'或'问候'。

这显然不是最好的方法,因为我想使用一个图标来表示“问候”和“用户”,甚至是其他一些我会被卡住的对象。

我是否需要创建另一个名为icons_object的表,然后列出icon_id和object_name? 看起来如果一个图标用于多个对象,我将不得不重复执行icon_id,但这是要走的路吗?

此外,Rails中的这个表关联是什么。假设表名为icons_objects。 然后在Rails中它会是

Icon.rb

icon has_many:icon_objects ?????

这里完全混淆,所以对NOOB的任何帮助都会受到赞赏。

有没有办法做到这种规范化?

2 个答案:

答案 0 :(得分:2)

您想要使用多态关联。例如:

class Icon < ActiveRecord::Base
  belongs_to :iconable, :polymorphic => true
end    

class Greeting < ActiveRecord::Base
  has_many :icons, :as => :iconable
end

class User < ActiveRecord::Base
  has_many :icons, :as => :iconable
end

然后你可以从问候或用户那里得到图标:

@user.icons
@greeting.icons
@icon.iconable  #returns the parent type.

或者,如果您想查询特定类型的图标:

Icon.where(:iconable_type => "greeting")

这种方法与您已采用的方法没有什么不同。执行此方法的好处是,您可以获取父对象而不必担心它是什么类型,就像您尝试在此线程中实现其他答案一样。

您只需运行一些迁移即可使所有内容正常运行。您可以在http://guides.rubyonrails.org/association_basics.html#polymorphic-associations找到更多信息。

根据评论编辑:

严格地说,你是对的。您不能拥有指向用户和问候语的多态记录。但是,您可以进行一些小改动并创建另一个模型,这类似于连接表。

class IconConnection < ActiveRecord::Base
  belongs_to :inconable, :polymorphic => true
  belongs_to :icon
end

class Icon < ActiveRecord::Base
  has_many :icon_connections
end

class Greeting < ActiveRecord::Base
  has_many :icon_connections, :as => :iconable
  has_many :icons, :through => :icon_connections
end

class User < ActiveRecord::Base
  has_many :icon_connections, :as => :iconable
  has_many :icons, :through => :icon_connections
end

每个IconConnection都会指向问候语或用户,并且每个IconConnection都会指向同一个图标。

此设置假设您可以为每个用户和问候语设置多个图标,但如果没有,则可以将has_many替换为has_one

答案 1 :(得分:0)

听起来你在谈论多对多的关系。因为图标可以属于多个对象,而对象可以有多个图标。你需要一个匹配的表来处理这种关系...就像你谈到的icon_objects。然后,您的模型将使用has_many :through关系或has_and_belongs_to_many。如果只存在icon_objects以将对象映射到图标,那么您可能想要使用has_and_belongs_to_many。如果您认为您需要存储有关特定对象的特定图标关系的其他信息,那么您可能需要实际的IconObject模型,并应使用has_many :through将图标映射到对象。

如果一个对象只能有一个图标,那么将外键放在每个对象表中(因此users有一个icon_id字段,greetings也是belongs_to字段。 {1}}表)。然后,用户和问候语与图标之间将具有has_many关系,而图标与用户和问候语之间将具有{{1}}关系。