2011-03-16 73 views
2

這裏是我的模型:迭代一個named_scope內的has_many收集

class Message < ActiveRecord::Base 
    has_many :comments 

    attr_accessible :read #bool 

    def unread_comments? 
    comments.each { |comment| return true unless comment.read?} 

    false 
    end 
end 

class Comment < ActiveRecord::Base 
    belongs_to :message 

    attr_accessible :read #bool 
end 

這是我所期待的事:我想在信息創建一個named_scope,叫unread基本上返回如果屬實任何消息的評論未讀或消息本身未讀。有什麼辦法可以做到這一點?

回答

3
class Message < AR::Base 
    ... 
    def unread? 
    !self.read && !self.comments.all?(&:read) 
    end 
end 
2

如何:

named_scope :unread, :conditions => ['messages.read = ? OR comments.read = ?', 
             false, false], 
        :include => :comments 
1

爲什麼命名的範圍是什麼?你可以只是做

def has_unread 
    !self.read || unread_comments? 
end 

,或者如果它需要一個類的方法

def self.has_unread(message) 
    msg = Message.find(message.id) 
    msg.read == false && msg.unread_comments? 
end 

是你真的想雖然使用命名範圍,你會想是這樣的:

scope :get_unreads, lambda {|message| 
    { :joins => :comments, 
    :conditions => {:comments => {:message_id => message.id}, :message => ['read',0]}, 
    :select  => "DISTINCT `clients`.*" # kill duplicates 
    } 
} 
def self.has_unread?(message) 
    self.get_unreads(message).exists? && self.find(message.id).read 
end