选择性活动记录



假设我有一个表"用户"。一个用户可以在我的表中存在 3 次(记录),处于 3 种不同的状态(状态 1、状态 2、状态 3)。将创建第一个状态 1,然后创建状态 2,...如果 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的最新状态

提前感谢!沃特

如果您提前计划,您可以随时对状态进行排序并返回"最高"状态。如果您有一个线性进展到下一个,这很有效。举个例子:

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

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

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

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

尝试:

User.get_user(state, uuid)

并在您的用户模型中制作范围:

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

最新更新