0

「ユーザー」というテーブルがあるとします。ユーザーは、3 つの異なる状態 (state1、state2、state3) で、テーブルに 3 回 (レコード) 存在できます。最初に 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 オブジェクトに変換する方法はありますか?

要するに、各 uuid の最新の状態のみを返す User.magic_function

前もって感謝します!ウーター

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 に答える