0

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

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

但是,用户还应该能够定义相对于他们的模块组出现的顺序模块。所以我想为每个模组添加一个属性,“等级”。

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

我能找到的最接近的答案是这个:has_many through form and added attribute to join table

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

4

1 回答 1

1

您可以通过再添加一个关联来做到这一点。正如您设置的那样,您不能拥有Mod超过Modulegroup. 试试这个:

AModulegroup应该有很多Mods并且 aMod应该属于 a 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中都是唯一的排名Modulegrouphas_many, through

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

default_scope :order('rank)
于 2013-07-22T15:10:11.770 回答