在执行ActiveRecord查询时,如何优先处理具有标记为true的属性的记录,然后在created_at desc之后?

时间:2016-06-20 23:09:41

标签: ruby-on-rails postgresql activerecord ruby-on-rails-5

我在Answers上有一堆Question

我想要做的是分两步为每个问题订购答案:

  1. 如果有接受的答案,请先退回那个,然后......
  2. 返回其余答案,created_at: :desc
  3. 如果#1不存在,则默认为2。

    这是我尝试过的,但它不起作用:

    [21] pry(main)> q.answers.order(:accepted, created_at: :desc)
    [23] pry(main)> q.answers.order(accepted: true, created_at: :asc).inspect
    ArgumentError: Direction "true" is invalid. Valid directions are: [:asc, :desc, :ASC, :DESC, "asc", "desc", "ASC", "DESC"]
    from /gems/activerecord-5.0.0.rc1/lib/active_record/relation/query_methods.rb:1164:in `block (2 levels) in validate_order_args'
    [24] pry(main)> q.answers.order(accepted: "true", created_at: :asc).inspect
    ArgumentError: Direction "true" is invalid. Valid directions are: [:asc, :desc, :ASC, :DESC, "asc", "desc", "ASC", "DESC"]
    from gems/activerecord-5.0.0.rc1/lib/active_record/relation/query_methods.rb:1164:in `block (2 levels) in validate_order_args'
    

    我如何实现这一目标?

    修改1

    这是accepted: true的答案示例:

    [26] pry(main)> q.answers.first
    => #<Answer:0x007f997d7a5a80
     id: 69,
     body:
      "public static Process CreateProcessAsUser(string filename, string args)\r\n {\r\n     var hToken = WindowsIdentity.GetCurrent().Token;\r\n     var hDupedToken = IntPtr.Zero;\r\n\r\n     var pi = new PROCESS_INFORMATION();\r\n     var sa = new SECURITY_ATTRIBUTES();\r\n     sa.Length = Marshal.SizeOf(sa);\r\n\r\n     try\r\n     {\r\n         if (!DuplicateTokenEx(\r\n                 hToken,\r\n                 GENERIC_ALL_ACCESS,\r\n                 ref sa,\r\n                 (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,\r\n                 (int)TOKEN_TYPE.TokenPrimary,\r\n                 ref hDupedToken\r\n             ))\r\n             throw new Win32Exception(Marshal.GetLastWin32Error());\r\n\r\n         var si = new STARTUPINFO();\r\n         si.cb = Marshal.SizeOf(si);\r\n         ",
     user_id: 1547,
     question_id: 47,
     created_at: Wed, 15 Jun 2016 05:20:11 UTC +00:00,
     updated_at: Mon, 20 Jun 2016 22:34:08 UTC +00:00,
     accepted: true,
     language: nil,
     comments_count: nil>
    

1 个答案:

答案 0 :(得分:1)

您需要将字符串传递给order方法:

q.answers.order("accepted = true DESC").order(:created_at)