在我的应用中,用户可以创建模块(“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语句。这似乎不对。
答案 0 :(得分:1)
您可以通过添加一个关联来实现此目的。在您进行设置后,您的Mod
不能超过Modulegroup
。试试这个:
Modulegroup
应该有多个Mods
,而Mod
应属于Modulegroup
。
你想要做的是更进一步。
您想要创建一个新模型,例如ModelgroupMod
,它有两列。这些是module_group_id
和mod_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)