Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在ActiveRecord中使用SELECT CASE语句作为Rails模型默认\u范围_Ruby On Rails - Fatal编程技术网

Ruby on rails 在ActiveRecord中使用SELECT CASE语句作为Rails模型默认\u范围

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

我有一个模型User,它可以是个人也可以是公司,这取决于布尔值,
是公司。如果用户是公司,
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:)问题是一个公司能做的一切,一个用户能做的只有很少的例外。唯一的区别是名字/姓氏问题,它位于该点旁边。用户不是公司。用户在公司工作。公司有员工(用户)。创建真实世界中的模型。是的——这就是我要做的——将使生活变得更加轻松!