【问题标题】:per user lookups每个用户查找
【发布时间】:2011-03-30 20:35:34
【问题描述】:

我正在用 Rails 重写一个大型的、写得很糟糕的 php 应用程序。我们已经在生产环境中运行该应用好几年了,现在对它实际需要做什么有了很好的了解,所以我希望从头开始,并最终获得一个可靠的代码库来支持我们的应用。

我想弄清楚的一件事是如何处理我们在许多模型上拥有的一些功能。该应用程序是一个多公司 Web 应用程序,使用该应用程序的每个公司(和所有用户)都有很多偏好和自定义查找。偏好很容易,我打算为用户和公司建立一个偏好模型,并制作那些本质上是键/值表。不过,我在使用我们的查找模型时遇到了更多困难。以状态为例。在典型的应用程序中,您将拥有一个状态表并完成它。在我们的例子中,状态可能会因登录用户所在的公司而异。

在当前的应用程序中,我认为这实现得相当糟糕。我们基本上有一个状态表和模型,以及一个 company_id 列。我们提供一组默认状态,company_id = -1。然后,如果一家公司覆盖了这些,我们将条目与他们的 company_id 一起保存到表中。在应用程序中,我们通过存储过程获取这些信息,我们基本上传入 company_id 并返回默认条目或公司特定条目。

我不喜欢这个,主要是因为它很难轻松访问数据。具体来说,在表中具有默认值和公司特定选项意味着您不能执行简单的查询来获取状态列表,它要么必须是 2 个查询(对于 company_id,然后如果没有结果,对于 -1)或在 sql 中执行计数和 if 语句的复杂查询/过程。不过从好的方面来说,它确实允许简单的关系,因为其他对象可以引用 status_id 并获取表中的任何状态。

我们可能在十几个不同的模型上都有这个功能,所以我试图为此想出一个可以在任何模型上轻松实现的好模型。

有没有人对更好的实施方式有任何建议?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

    一种可能性是简单地将状态实现为用户模型的一种方法。例如:

    class User < ActiveRecord::Base
      belongs_to :company
    
      # users table has a status column
      def status
        read_attribute(:status) || company.default_status
      end
    end
    

    现在用户可以设置状态,或者状态可以为 NULL。如果状态为 NULL,则 read_attribute(:status) 返回 nil,而我们返回的是 company.default_status。

    如果您需要变得比这更复杂,并且每个用户可能有多个状态,您可以在 Status 模型上执行类似的技巧,在该模型中覆盖相关值列的读取器并在值为时提供后备情况空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      相关资源
      最近更新 更多