我有一个模型User,可以是个人或公司,具体取决于布尔值is_company
的值。如果用户是公司,则company_name
存储该名称;如果用户是个人,则first_name
和last_name
会存储他们的姓名。
在绝大多数情况下,我希望用户默认按last_name
或company_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')
谢谢!
答案 0 :(得分:2)
您需要重新考虑您的设计。可以成为公司的用户对我来说听起来不是一个好设计。我认为您最好使用单独的User
和Company
模型。
你的排序也会那么容易..
答案 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更改为仅按新列