2012-04-12 56 views
0

假設我有一個'用戶'表。 用戶可以在我的表中以3種不同狀態(state1,state2,state3)存在3次(記錄)。 首先創建狀態1,然後創建狀態2,... 如果狀態3存在,我不想再查看狀態1和狀態2,但我必須將它們留在我的表中,以備後用。 所有3條記錄都有相同的uuid。選擇性活動記錄

如果我想收集所有用戶,我不能使用User.all(因爲他會給我所有3個州的同一個用戶)。

在我的模型中是否有一個簡短的解決方案?現在我收集所有的uuid和每個uuid,我會檢查哪一個是最新狀態,然後將這些記錄放入一個數組中。 這個數組的問題在於它只是'一個數組',而不是一個ActiveRecord對象。

@uuid = [] 
@users = [] #will contain only the latest states at the end 

User.all.each do |u| 
    @uuid << u.uuid unless @uuid.includes?(u.uuid) 
end 

@uuid.each do |u| 
    if user = User.find_by_state_and_uuid(3, u) 
    @users << user 
    elsif user = User.find_by_state_and_uuid(2, u) 
    @users << user 
    elsif user = User.find_by_state_and_uuid(1, u) 
    @users << user 
    end 
end 

任何想法如何將此邏輯轉換爲ActiveRecord對象?

總之:User.magic_function只返回最新狀態的每個UUID的

提前感謝! Wouter

回答

0

您是否使用過scopes?您應該能夠爲每個用戶狀態創建一個範圍,然後將其用於查詢。

0

嘗試:

User.get_user(state, uuid) 

,並在您的用戶模型範圍:

scope :get_user, lambda { |*args| { :conditions => ["state = ? AND uuid = ?",args.first , args.second ] }} 
1

如果你提前計劃,你總是可以排序你的狀態,並返回「最高」之一。如果你從一個到另一個線性進展,這很好。舉個例子:

user = User.where(:uuid => u).order('users.state DESC').first 

對於更復雜的轉換,你將無法使用這個技巧。您可以嘗試使用不同的列進行排序,例如獲取created_at時間的最後一列。

從設計角度看,在不同狀態下有多個用戶記錄是非常不尋常的。一個更好的計劃可能是將狀態驅動的用戶記錄部分拆分成單獨的表格,並在那裏進行狀態追蹤,所有事物都鏈接回單獨的用戶記錄。