0
我有以下型號範圍:軌的映射表
class Message < ActiveRecord::Base
has_many :read_messages
module Scopes
def by_read_status(read_status, user_id)
case read_status
when 'Unread'
when 'Read'
joins(:read_messages).where(:read_messages => {:read => true, :admin_user_id => user_id})
else
where('1 = 1') # no scope necessary
end
end
end
extend Scopes
end
和...
class ReadMessage < ActiveRecord::Base
has_many :admin_users
has_many :messages
end
我有一個名爲 'mark_as_read' 該消息的控制器方法。它只是使用該消息標識創建一個新的read_message記錄,並標記爲已讀的人員的管理員用戶標識。由於消息是全局的,我希望系統的每個用戶能夠獨立管理讀取狀態(這就是爲什麼我在那裏有額外的層)。正如你可以在我的範圍中看到的那樣,by_read_status('Read',user_id)會返回所有找到映射記錄的記錄。問題是,我怎麼能做到相反? (返回沒有找到地圖記錄的所有記錄,或者地圖記錄:read設置爲false)?
我使用的範圍是這樣的:
@search = Message.search(params[:q])
messages = @search.result.accessible_by(current_ability)
messages = messages.by_company(session[:company_filter]) if session[:company_filter] && session[:company_filter] > 0
messages = messages.by_campaign(session[:campaign_filter]) if session[:campaign_filter] && session[:campaign_filter] > 0
read_filter = params[:read].blank? ? 'Unread' : params[:read]
messages = messages.by_read_status(read_filter, current_admin_user.id)
messages = messages.page(params[:page]).per(20)
@messages = MessageDecorator.new(messages)
所以,你可以在中間有我的範圍的看,我已經得到了by_read_status。如果我返回一個數組,或者除了作用域對象之外的東西,它會拋出一個合適的。任何人都可以幫我弄清楚如何做我範圍內的'未讀'部分?
謝謝!
編輯答案
exclude = Message.by_read_status('Read', user_id).map(&:id)
exclude = [0] unless exclude.size > 0
where("id not in (?)", exclude)
偉大的想法,謝謝!我不得不稍微調整它以考慮空陣列。 (它會通過id而不是(NULL),並且它不會返回任何內容。如果沒有讀取消息,這只是一個問題)。再次感謝! – Sean