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

在此处输入图像描述

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

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

我是否需要创建另一个名为icons_object的表,然后列出icon_id和object_name? 好像我必须做很多重复icon_id的,如果一个图标用于几个对象,但这是要走的路吗?

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

Icon.rb

icon has_many:icon_objects ?????

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

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

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

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都会指向一个问候语或一个用户,每个IconConnections都会指向同一个Icon。

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

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

如果一个对象只能有一个图标,那么将外键放在每个对象表中(因此users有一个icon_id字段, greetings表也​​是如此)。 然后,User和Greeting将与Icon具有belongs_to关系,而Icon将与User和Greeting具有has_many关系。