2011-03-30 59 views
1

我正在重写一个大的,可怕的书面的PHP应用程序在rails中。我们已经在生产中运行这款应用已经有好几年了,现在对它真正需要做什么有了很好的理解,所以我期待着开始干净,并最终获得一个可靠的代码库来支持我们的应用。每个用户查找

我想弄清楚的一件事是如何处理我们在很多模型上的一些功能。该应用程序是一个多公司的Web应用程序,每个使用该应用程序的公司(以及所有用户)都有很多偏好和自定义查找。首选项很容易,我打算为用户和公司建立一个首选项模型,然后制定这些主要/关键值表。尽管如此,我仍在努力寻找更多的查找模型。举例来说,状态。在一个典型的应用程序中,您将拥有一个状态表并完成它。在我们的案例中,状态可以根据登录用户的公司而变化。

在目前的应用程序,这是实施相当糟糕,我认为。我们基本上有一个状态表和模型,带有一个company_id列。我们提供一组缺省状态,其中company_id = -1。然后,如果公司覆盖这些,我们用他们的company_id将条目保存到表中。在应用程序中,我们通过存储过程来获取这些存储过程,我们基本上通过了company_id,并返回默认条目或公司特定条目。

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

我们在大概十几个不同的模型上有这个功能,所以我正在试图想出一个很好的模型,可以很容易地在任何模型上实现。

有没有人有更好的方法可以实施这方面的任何建议?

回答

0

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

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。

如果您需要比这更复杂并且可能每个用户有多个状态,那么您可以在状态模型上执行一个类似的技巧,在这里您覆盖相关值列的阅读器,并提供回退情况一片空白。