首先订购某些用户的评论,然后按评论评分

时间:2018-04-21 04:28:42

标签: sql ruby-on-rails postgresql ruby-on-rails-4 activerecord

在Rails 4项目中,我有articles has_many comments

我正在尝试在评论score(评论表中的整数列)排序的文章下显示评论列表,但是首先显示来自少数用户的评论(例如,admins& mods)。这些用户将作为user_id数组传递给查询(user_id也是注释表中的一列):

class Comment < ActiveRecord::Base
  # article_id  :integer
  # user_id     :integer
  # score       :integer

  belongs_to :article
  belongs_to :user

  scope :by_users, -> (user_ids) { order("user_id IN (?), score DESC", user_ids) }

因此:

some_article.comments.by_users([1,2,3])

这个范围给出了语法错误,我无法完成一个命令注释的查询,以便返回所有文章的注释,首先显示来自传递数组中具有user_id的用户,然后通过注释得分进行二次排序

更新

Mahemoff的伟大条件性想法对Postgres不起作用,但会导致这种不起作用的尝试:

scope :by_users, -> (user_ids) { order("case when (user_id IN (?)) then 0 else 1 end, score DESC", user_ids) }

这给了我一个与占位符?相关的PostgreSQL语法错误,这是我无法修复的。

2 个答案:

答案 0 :(得分:0)

试试这个:

const obj = {}; //some object
Object.defineProperties(obj,
      {
        t: { //obj.t
          get() {
            return obj.t;
          },
          //here capturing destructive assignment of some object property
          set(newT) {   
            //do something
          }
        }
      });

答案 1 :(得分:0)

使用 mahemoff &amp; mu太短的帮助和建议,这是我的工作范围:

scope :by_users, -> (user_ids) { order([sanitize_sql("case when (user_id IN (#{user_ids.join(',')})) then 0 else 1 end"), "score DESC" ]) }

这有些不完美,因为Rails'order显然不支持?占位符,所以我使用了字符串插值(尽管user_ids不是用户公开的)清理了sql。

...虽然这是一个令人沮丧的问题,是使用.last来检索最终记录是不可能的。 some_article.by_users[1,2].last现在抛出一个错误,因为AR无法解决在哪里扭转排序:

ORDER BY case when (user_id IN (1 DESC, 2)) then 0 else 1 end DESC, score ASC LIMIT 1

...叹息