我正在努力重写一个庞大的,可怕写的php应用程序。我们已经在生产中运行应用程序已有好几年了,现在对它实际需要做的事情有了很好的理解,所以我希望开始干净,最后找到一个可靠的代码库来支持我们的应用程序。
我想弄清楚的一件事是如何处理我们在很多模型上的一些功能。该应用程序是一个多公司Web应用程序,使用该应用程序的每个公司(以及所有用户)都有很多首选项和自定义查找。首选项很简单,我打算为用户和公司设置一个首选项模型,并使这些基本上是键/值表。尽管如此,我还是在寻找我的查找模型。以身份为例。在典型的应用程序中,您将拥有状态表并完成它。在我们的例子中,状态可能会根据登录用户的公司而有所不同。
在当前的应用程序中,我认为这实现得相当糟糕。我们基本上有一个Status表和模型,带有company_id列。我们提供了一组默认状态,其中company_id = -1。然后,如果公司覆盖了这些,我们使用他们的company_id将条目保存到表中。在应用程序中,我们通过存储过程获取这些存储过程,我们基本上传递给company_id,它返回默认条目或公司特定条目。
我不喜欢这个,主要是因为它很难轻松访问数据。具体来说,在表中使用默认值和公司特定选项意味着您无法进行简单查询以获取状态列表,它必须是2个查询(对于company_id,如果没有结果,则为-1)或者复杂的查询/过程在sql中执行count和if语句。从好的方面来说,它确实允许简单的关系,因为其他对象可以引用status_id并获得表中的任何状态。
我们在十几种不同的型号上都有这个功能,所以我试图想出一个可以在任何型号上轻松实现的好模型。
有没有人对更好的方法有任何建议?
答案 0 :(得分:0)
一种可能性是简单地将状态实现为User模型的方法。例如:
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模型上做类似的技巧,你可以覆盖相关值列的阅读器,如果值是,则提供后备情况NULL。