1

ユーザーの Time レコードのセットを取得しようとしています。クエリは、パブリック (つまり、private == false) またはプライベート (つまり、private == true) のいずれかであり、ユーザーがその時間のスロット レコードを持っているネットワークをスコープとするレコードを返す必要があります。

これを ActiveRecord で実行したいのですが、私が見つけた唯一の方法は、2 つの別々のクエリを実行することです。結果がチェーンなどを防止する ActiveRecord リレーションではなく配列であることを除いて、これは問題ありません。

助言がありますか?

class TimeAccessPolicy
  attr_reader :network

  def initialize(network)
    @network = network
  end

  def accessible_times_for(user)
    return [] unless user.is_member_of?(network)
    times = network.times.where(private: false)
    times + network.times.joins(:slots).where(private: true, slots: {user_id: user.id})
  end
end

- 編集:

class Time < ActiveRecord::Base
  belongs_to :network
  has_many   :slots
  has_many   :participants, through: :slots, source: :user

  # has private boolean
  ...
end

class Network < ActiveRecord::Base
  has_many   :memberships, as: :memberable, dependent: :destroy
  has_many   :users, through: :memberships
  has_many   :times

  ...
end

class Slot < ActiveRecord::Base
  belongs_to :user
  belongs_to :time

  ...
end
4

1 に答える 1

1

スコープメソッドを使用できます

このような:

times = network.times.scoped
# times is still ActiveRecord relation
if private
  times = times.joins(:slots).where(private: true, slots: {user_id: user.id})
else
  times = times.where(private: false)
end

このコードは 1 つのクエリのみを実行します

于 2012-04-23T18:57:01.347 に答える