2012-04-12 97 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时间的最后一列。

从设计角度看,在不同状态下有多个用户记录是非常不寻常的。一个更好的计划可能是将状态驱动的用户记录部分拆分成单独的表格,并在那里进行状态追踪,所有事物都链接回单独的用户记录。