2016-11-27 138 views
0
User.where(id: users_ids) 
    .joins('LEFT JOIN names ON names.user_id = users.id AND names.primary = 1') 
    .joins('LEFT JOIN emails ON emails.user_id = users.id AND emails.primary = 1') 
    .select('users.*, names.first_name AS f_name , emails.email AS primary_email') 

我需要订购记录f_name。当f_namenil时,记录将移至最后并通过电子邮件进行排序。Ruby on Rails:空值的订单记录

下面是查询,

User.where(id: users_ids) 
    .joins('LEFT JOIN names ON names.user_id = users.id AND names.primary = 1') 
    .joins('LEFT JOIN emails ON emails.user_id = users.id AND emails.primary = 1') 
    .select('users.*, names.first_name AS f_name , emails.email AS primary_email') 
    .where('names.first_name IS NOT NULL') 
    .order('f_name asc').union(
User.where(id: users_ids) 
    .joins('LEFT JOIN names ON names.user_id = users.id AND names.primary = 1') 
    .joins('LEFT JOIN emails ON emails.user_id = users.id AND emails.primary = 1') 
    .select('users.*, names.first_name AS f_name , emails.email AS primary_email') 
    .where('names.first_name IS NULL') 
    .order('primary_email asc')) 

上面的查询不起作用。

数据库 - MySQL的

+0

它是如何不工作? –

+0

对不起,我忘了添加我正在使用分页'.paginate(page:params [:page])。per_page(10)'并且错误'undefined method'paginate'for#' –

+0

不知道Arel :: Nodes :: Union或paginate方法来自何处。可能不是'.union',请尝试使用'||'或'.or'(如果您使用的是Rails 5) –

回答

0

我解决不良方式这个问题,但解决

users_with_names = User.where(id: users_ids) 
         .joins('LEFT JOIN names ON names.user_id = users.id AND names.primary = 1') 
         .joins('LEFT JOIN emails ON emails.user_id = users.id AND emails.primary = 1') 
         .select('users.*, names.first_name AS f_name , emails.email AS user_email') 
         .where('names.first_name IS NOT NULL') 
         .order('f_name asc') 

users_without_names = User.where(id: users_ids) 
          .joins('LEFT JOIN names ON names.user_id = users.id AND names.primary = 1') 
          .joins('LEFT JOIN emails ON emails.user_id = users.id AND emails.primary = 1') 
          .select('users.*, names.first_name AS f_name , emails.email AS user_email') 
          .where('names.first_name IS NULL') 
          .order('user_email asc') 

@contacts = [users_with_names, users_without_names].flatten.paginate(page: params[:page], per_page: 10) 
0

这个问题是这样解决的

joins('LEFT JOIN names ON names.user_id = users.id AND names.primary = 1') 
.joins('LEFT JOIN emails ON emails.user_id = users.id AND emails.primary = 1') 
.select('users.*, names.first_name AS f_name , emails.email AS user_email, 
      names.last_name AS l_name, names.middle_name AS m_name, ISNULL(names.first_name) AS name_present') 
.order('name_present, f_name ASC, emails.email ASC') 
.group('users.id')