【问题标题】:Storing list of actions in Rails app在 Rails 应用程序中存储操作列表
【发布时间】:2012-12-19 22:31:43
【问题描述】:

我需要一些建议。我正在制作一个学习起来有点复杂的应用程序。它有一个用户模型。用户注册后,我希望在他/她第一次(也是第一次)访问某些页面时出现一个模式对话框。例如,有“投票”页面和“创建投票”页面等。

实施此类帮助系统的最佳方式是什么?我想在我的用户模型中添加一个列,该列可以包含一个默认值列表,例如“投票、创建、共享”。当用户访问与这些操作之一对应的页面时,如果该操作的名称仍在列表中,则会出现模式并且该操作的名称将从列表中删除。

这听起来合理吗?我知道在规范化数据库中,您不应该在单个字段中存储多个值。但是创建一个名为“actions”的表和另一个连接表来将用户与操作相关联似乎很疯狂。用户在网站上只能做 4 或 5 件事。

或者还有其他我想念的方法吗?提前感谢您的建议。

【问题讨论】:

  • 如果用户可能做的这组事情完全是静态的并且永远不会改变,那么以类似于您的建议的方式进行非规范化应该不会有太多问题。但是,我建议该列是 MySQL 的 SET 类型,或者您有多个 MySQL 的 BOOLEAN 类型的列(每个操作一个)。
  • 请不要在 Rails 应用程序中使用SET。它非常脆弱,在列表中引入新值需要更改架构。重建大表可能需要大量停机时间才能完成。

标签: mysql ruby-on-rails database web-applications


【解决方案1】:

您可能应该创建一个 UserTrigger 模型,该模型可用于“触发”某些此类操作。在实践中它看起来像这样:

<% for_trigger(@user, :first_time_help) do %>
...help content...
<% end %>

此方法的定义大致如下:

def for_trigger(model, name)
  if (model.triggers.where(:name => name.to_s).delete_all > 0)
    yield
  end
end

较软的版本将具有should_trigger?did_trigger! 方法对,其中一个将测试,另一个将实际删除触发器记录。对于大多数情况,这种单发应该足够了。

您的用户模型中的定义大致如下:

class User < ActiveRecord::Base
  has_many :triggers,
    :class_name => 'UserTrigger'
end

class UserTrigger < ActiveRecord::Base
  belongs_to :user
end

您必须在您的用户模型或任何其他需要它的模型上预先填充这些触发记录after_create。要重新设置触发器,只需重新添加记录即可。

【讨论】:

    猜你喜欢
    • 2017-09-06
    • 2016-06-16
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多