12

ユーザーがいます。ユーザーは、自分自身を突くだけでなく、他のユーザーを突くことができます。各ポークは方向性があり、グループポークは存在しません。セルフポーク(incoming_とoutgoing_pokesの両方として存在する)を複製せずに、特定のユーザーのすべてのポーク(着信または発信)を一覧表示したいと思います。

これが私のモデルです:

class User < ActiveRecord::Base
  has_many :outgoing_pokes, :class_name => "Poke", :foreign_key => :poker_id
  has_many :incoming_pokes, :class_name => "Poke", :foreign_key => :pokee_id
end

class Poke < ActiveRecord::Base
  belongs_to :poker, :class_name => "User"
  belongs_to :pokee, :class_name => "User"
end

モデルにメソッドを作成してUser、ポークをマージしてみました。

def all_pokes
  outgoing_pokes.merge(incoming_pokes)
end

ただし、これはセルフポーク(incoming_とoutgoing_pokesの両方)のみを返します。アイデア?アソシエーションを直接使用してこれを行うためのクリーンな方法はありますか?

また、マージされたリストでは、現在のユーザーとの関係を記録するために、各ポークに2つのブール値があると便利です。outgoingとのようなものincoming

4

2 に答える 2

12

all_pokesメソッドがセルフポークのみを返す理由outgoing_pokesは、がまだ配列ではなく、連鎖できるAR関係であるためです。mergeこの場合、クエリを実行する前に結合します。

必要なのは、実際にクエリを実行し、結果セットをマージすることです。

def all_pokes
  (outgoing_pokes.all + incoming_pokes.all).uniq
end

...または、独自のクエリを作成することもできます。

def all_pokes
  Poke.where('poker_id = ? OR pokee_id = ?', id, id)
end

着信か発信かを判断する:

# in poke.rb
def relation_to_user(user)
  if poker_id == user.id
    poker_id == pokee_id ? :self : :poker
  elsif pokee_id == user.id
    :pokee
  else
    :none
  end
end
于 2012-07-14T18:03:47.103 に答える
12

Rails 5にORクエリがあるので、非常に読みやすいソリューションがあります。

def pokes
  outgoing_pokes.or(incoming_pokes)
end

ActiveRelationがall返され、他のメソッドをチェーンできるため、メソッド名は省略しました。

@user.pokes.where(...).includes(...)
于 2018-05-22T13:08:35.860 に答える