Ruby on rails 在ActiveRecord中使用SELECT CASE语句作为Rails模型默认\u范围
我有一个模型User,它可以是个人也可以是公司,这取决于布尔值,Ruby on rails 在ActiveRecord中使用SELECT CASE语句作为Rails模型默认\u范围,ruby-on-rails,Ruby On Rails,我有一个模型User,它可以是个人也可以是公司,这取决于布尔值,是公司。如果用户是公司,company\u name存储名称;如果用户是个人,first\u name和last\u name存储他们的姓名 在绝大多数情况下,我希望默认情况下用户按姓氏或公司名排序,因此我在用户模型中使用默认范围 然而,我拥有它的方式——即使它适用于SQLLite——并不与数据库无关。有人能告诉我如何重构它以接受case语句中的参数“true”吗 default_scope select('users.*') de
是公司。如果用户是公司,company\u name
存储名称;如果用户是个人,first\u name
和last\u name
存储他们的姓名
在绝大多数情况下,我希望默认情况下用户按姓氏
或公司名
排序,因此我在用户模型中使用默认范围
然而,我拥有它的方式——即使它适用于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')
谢谢 你需要重新思考你的设计。对我来说,一个可以成为公司的用户听起来不是一个好的设计。我认为您最好使用单独的用户
和公司
模型
这样排序也会容易得多。您可能希望在写入数据库时进行适当的重新设计以处理此问题
- 在用户表上为
display\u name
- 在用户模型中,在保存前创建一个
回调,将显示名称设置为:
before_save :set_display_name
def set_display_name
self.display_name = self.is_company? ? self.company_name : self.last_name
end
- 将默认的_范围更改为仅按新列排序
也许你应该把这两个字母分开?很抱歉破坏了这么大的声誉;)没问题,我很高兴能达到1000:)问题是一个公司能做的一切,一个用户能做的只有很少的例外。唯一的区别是名字/姓氏问题,它位于该点旁边。用户不是公司。用户在公司工作。公司有员工(用户)。创建真实世界中的模型。是的——这就是我要做的——将使生活变得更加轻松!