2015-12-11 7 views
0

Я использую метод find_by_sql для поиска пользователей в моем userstable.Rails find_by_SQL with Rails

Есть ли возможность использовать код рельсов в инструкции выбора?

User.find_by_sql ["SELECT DISTINCT 
        users.* 
        FROM 
        users 
        JOIN 
        clients_courses cc 
        ON 
        cc.client_id = users.client_id 
        LEFT JOIN 
        memberships m 
        ON 
        m.user_id = users.id AND m.course_id = cc.course_id 
        WHERE 
        cc.course_id = ? 
        AND 
        m.user_id IS NULL 
        AND 
        users.active = ? 
        AND 
        users.firstname LIKE ? or users.lastname LIKE ? 
        AND NOT IN (RAILS CODE)", self.id, true, "#{search}%", "#{search}%"] 
    end 

Я пометил положение с рельсами КОД

Я хочу сделать это Линке коснуться:

Membership.where ("? Course_id =", self.id) .users

Есть ли способ сделать это?

+0

Почему вы все равно используете 'select_by_sql'? Это можно сделать с помощью методов activerecord 'uniq',' join' и 'where' –

+0

вы можете показать мне, как это работает? – Felix

+0

Вам нужна способность выбирать пользователей для нескольких 'mambership's или только для одного идентификатора каждый раз? – Vasfed

ответ

1

Вы можете сделать это -

member_user_ids = [] 
    Membership.where("course_id = ?", self.id).map{|membership| membership.users.map{|user| member_user_ids << user.id}} 

    # you might want to put a uniq! on member_user_ids 

    User.find_by_sql ["SELECT DISTINCT 
       users.* 
       FROM 
       users 
       JOIN 
       clients_courses cc 
       ON 
       cc.client_id = users.client_id 
       LEFT JOIN 
       memberships m 
       ON 
       m.user_id = users.id AND m.course_id = cc.course_id 
       WHERE 
       cc.course_id = ? 
       AND 
       m.user_id IS NULL 
       AND 
       users.active = ? 
       AND 
       users.firstname LIKE ? or users.lastname LIKE ? 
       AND users.id NOT IN (#{member_user_ids.join(',')})", self.id, true, "#{search}%", "#{search}%"] 

Вы также можете посмотреть на link, который объясняет, как поместить массив строк в том, где положение.

+0

именно то, что мне нужно! Большое спасибо. – Felix

+0

В режиме dev он отлично работает. Но в тестовом режиме он запускается с ошибкой: undefined method 'users 'для # В чем может быть причина – Felix

+0

Спасибо за обновление, но я снова получил эту ошибку: undefined method' users' for # <Членство: 0x00000007984110> – Felix

Смежные вопросы