RoR中模型的通用标志

时间:2012-05-31 00:57:19

标签: ruby-on-rails database architecture

我正在制作一个Ruby on Rails应用程序,并且意识到我的User类可能最终会产生许多通用的布尔/整数属性。例如,假设我每个季度都有促销活动,而我只希望一个人能够使用促销一次。然后,我必须每季度使用一个新列has_used_promotion_N来跟踪该促销。

或者,我正在考虑创建一个名为“Generic Flags”的新列,它只是帐户上设置的标志的逗号分隔值。例如:

可以为某个特定用户设置“has_used_promotion_1,has_used_promotion_2,limit_on_feature_a = 20”等

(或者我可能将其存储为JSON)

无论如何,我想在我的数据库中给自己一些类似NoSQL的功能。

出于某种原因这是非常糟糕的设计吗?有没有其他人这样做过?我完全没有关于RoR的任何事情?

2 个答案:

答案 0 :(得分:3)

在我看来,促销应该是一个与用户有多对多关系的独立模型。当您进行促销时,您将创建一个促销实例,当一个人使用该促销时,您将该人添加到promotion.users关系。

这比你的想法要好得多,因为你现在可以查询这些关系。想要使用第一季度促销活动的所有用户的列表?没问题。你可以用你的解决方案做到这一点,但你必须采取一些hackiness(这是一个单词?)来做到这一点,你必须在每个查询上为每个用户解析通用标志字符串。至少可以说是不理想的。

答案 1 :(得分:0)

如果有一个任意大小的关联集合,那么它应该是一个真实的关系,使用现有的数据库和设施建模。促销听起来像这样,似乎你已经在你的数据库中建模了;没有真正的理由保持重复的价值层次。

对于实际 -generic标志,您可以拥有一个named-flag表,并再次使用真实的关联。

could也只是将标志对象序列化为文本列。但是,这样做会妨碍您对标志/标志值进行简单搜索的能力。对于与您不关心的单个用户相关的一大堆标志可能无关紧要,除非他们已经登录,但是要轻视 - 这取决于您的用例。