2014-03-02 29 views
2

假設我有一個Message模型,具有senderreceiver屬性。什麼是軌道方式來獲取所有在兩個用戶之間交換的消息?我寫了一些範圍和SQL語句的某些聯合查詢 - 導軌

scope :some_scope, lambda { |sender = nil, receiver = nil| where({:sender_id => sender, :receiver_id => receiver})} 

,然後我串聯Message.some_scope(some_receiver,some_sender)Message.some_scope(some_sender,some_receiver),但我不認爲這是一個最佳實踐(順便說一句,我沒有找到一個簡單的方法,使在railsunion語句)

回答

3

在這種情況下最好使用類方法,因爲它既複雜又需要參數。此外,而不是使用工會,你可以只是or你關心在一起的兩個條件。

def self.conversation(id1, id2) 
    id1_to_id2 = where(sender_id: id1, receiver_id: id2).where_values.reduce(:and) 
    id2_to_id1 = where(sender_id: id2, receiver_id: id1).where_values.reduce(:and) 
    where(id1_to_id2.or(id2_to_id1)) 
end 

現在你可以這樣做:

Message.conversation(user1.id, user2.id) 

這會給你user1user2之間的所有消息。

+0

[「使用類方法是接受範圍參數的首選方法。」](http://guides.rubyonrails.org/active_record_querying.html#passing-in-arguments),所以我認爲*可能更清潔*應該是*你應該使用類方法*。儘管如此,這只是挑剔。 –