0

假设我有一张“用户”表。一个用户可以在我的表中存在 3 次(记录),处于 3 个不同的状态(state1、state2、state3)。首先将创建 state1,然后创建 state2,...如果 state3 存在,我不想再查看 state1 和 state2,但我必须将它们保留在我的表中,以备后用。所有 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 的最新状态

提前致谢!沃特

4

3 回答 3

1

如果您提前计划,您总是可以对您的状态进行排序并返回“最高”的状态。如果你有一个从一个到下一个的线性进展,这很有效。举个例子:

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

对于更复杂的过渡,您将无法使用此技巧。您可以尝试使用不同的列进行排序,例如按created_at时间获取最后一个。

从设计的角度来看,在不同状态下拥有多个用户记录似乎非常不寻常。更好的计划可能是将用户记录的状态驱动部分拆分到一个单独的表中,并在那里进行状态跟踪,所有内容都链接回单个用户记录。

于 2012-04-12T14:41:53.257 回答
0

您是否考虑过使用范围?您应该能够为每个用户状态创建一个范围,然后使用它们进行查询。

于 2012-04-12T13:05:21.853 回答
0

尝试 :

User.get_user(state, uuid)

并在您的用户模型中设置范围:

  scope :get_user, lambda { |*args| { :conditions => ["state = ? AND uuid = ?",args.first , args.second ] }}
于 2012-04-12T13:15:09.213 回答