在ActiveRecord中使用SELECT CASE语句,作为Rails模型default_scope

时间:2011-10-03 13:28:34

标签: ruby-on-rails

我有一个模型User,可以是个人或公司,具体取决于布尔值is_company的值。如果用户是公司,则company_name存储该名称;如果用户是个人,则first_namelast_name会存储他们的姓名。

在绝大多数情况下,我希望用户默认按last_namecompany_name排序,因此我在用户模型中使用default_scope。

然而,我拥有它的方式 - 即使它适用于SQLLite - 与数据库无关。任何人都可以告诉我如何重构这个以接受case语句中的“true”参数吗?

default_scope select('users.*')
default_scope select('CASE WHEN is_company = "t" THEN company_name ELSE last_name END AS sort_name')
default_scope order('sort_name ASC')

谢谢!

2 个答案:

答案 0 :(得分:2)

您需要重新考虑您的设计。可以成为公司的用户对我来说听起来不是一个好设计。我认为您最好使用单独的UserCompany模型。

你的排序也会那么容易..

答案 1 :(得分:0)

您可能希望在写入数据库时​​进行适度的重新设计来处理此问题。

  • 在“用户”表格中为display_name
  • 创建一个新列
  • 在您的用户模型中创建一个before_save回调,用于设置显示名称,如:

    before_save :set_display_name
    
    def set_display_name
     self.display_name = self.is_company? ? self.company_name : self.last_name 
    end
    
  • 将default_scope更改为仅按新列

  • 排序