将属性分配给rails中的连接表

时间:2013-07-22 14:52:50

标签: ruby-on-rails has-many-through has-many

在我的应用中,用户可以创建模块(“mods”以避免保留命名),并可以将它们分组到模块组

class User
  has_many :modulegroups
  has_many :mods, through :modulegroups

class Modulegroup
  belongs_to :user
  belongs_to :mod

class Mods
  has_many :modulegroups
  has_many :users, through :modulegroups

但是,用户还应该能够定义与其模块组相关的顺序 mod。所以我想为每个mod添加一个属性“rank”。

因为同一个mod在一个组中的排名可能与另一个组不同,所以它不应该是mods表中的列,也不应该是用户表中的列。我该如何定义这些等级?

关于SO的最接近的答案我可以找到这个:has_many through form and adding attribute to join table

但我的需求有点不同,我不想在模型中坚持使用丑陋的SQL语句。这似乎不对。

1 个答案:

答案 0 :(得分:1)

您可以通过添加一个关联来实现此目的。在您进行设置后,您的Mod不能超过Modulegroup。试试这个:

Modulegroup应该有多个Mods,而Mod应属于Modulegroup

你想要做的是更进一步。

您想要创建一个新模型,例如ModelgroupMod,它有两列。这些是module_group_idmod_id。 (我们将在一秒内添加排名)

现在您再次更改关联。

class Modulegrpoup
   has_many :mods, through: :modelgroup_mod

class Mod
  has_many :mods, through: :modelgroup_mod

class ModulegroupMod
   belongs_to :modulegroup
   belongs_to :mod

现在,您可以将rank列添加到ModulegroupMod,并且可以通过Modulegroup调用设置每个has_many, through中唯一的排名。

来自另一个链接的SQL语句是完全没必要的,因为它们正在做一些有点不同的事情。您可能想要添加的内容是ModuegroupMod的范围,您可以按rank订购。

default_scope :order('rank)