2016-11-27 8 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') 

Ich muss Datensätze von f_name bestellen. Wenn f_namenil ist, werden Datensätze zum Ende verschoben und per E-Mail bestellt.Ruby on Rails: Bestelldatensätze mit Nullwert

Unten ist die Abfrage,

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')) 

Die obige Abfrage nicht funktionieren.

Datenbank - MySql

+0

Wie ist es nicht funktioniert? –

+0

Sorry, ich habe vergessen hinzuzufügen, dass ich die Paginierung '.paginate (page: params [: page]). Per_page (10)' verwende und den Fehler 'undefined method 'paginate' für # ' –

+0

Nicht sicher über Arel :: Nodes :: Union oder wo die Paginat-Methode herkommt. Vielleicht anstelle von ".union", versuchen Sie es mit '||' oder '.oder' (wenn Sie Rails 5 verwenden) –

Antwort

0

Ich löste dieses Problem durch schlechte Art und Weise, aber aufgelöst

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

Dieses Problem wird auf diese Weise behoben

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')