2013-04-02 1 views
0

я в настоящее время этот объем:Как использовать метод AREL эк() в а, где соединяемых данным

class User 

    has_many :inbox_messages, :through => :message_users do 
    def unread 
     published.where(:message_users => { :sender => false, :trash => false , :deleted => false}).where(MessageUser.arel_table[:read_at].not_eq(nil)) 
    end 

    end 
end 

И это работает. Но мне было интересно, есть ли способ объединить второй where в первый.

+1

оба 'where' положения для одной и той же таблицы (то есть таблица, которая использует MessageUser)? –

+0

Проверьте отредактированный код. – Nerian

ответ

3

Если я понимаю ваш код правильно, вы должны быть в состоянии сделать это с

published.where(:message_users => { :sender => false, :trash => false , :deleted => false, :read_at => nil }) 
+0

О, верно; но что, если вместо этого это было «не ноль»? – Nerian

+1

Тогда вам нужно это как отдельный оператор 'where', который использует что-то вроде' .arel_table [: read_at] .not_eq (nil) ', так как вы не можете смешивать это с существующим Hash, который вы передали в': message_users '. –

+1

Существует также библиотека с открытым исходным кодом [Squeel] (https://github.com/ernie/squeel), которая делает эти выражения более естественными с помощью пользовательского DSL (например, вы можете использовать '! = Nil'). Подробные сведения см. В его документах. –