0

私はusersテーブルとテーブルを持っていblocked_usersます。usersには、すべての認証データ、サイト設定などがあり、 とblocked_userssource_idありtarget_idます。

ユーザーがブロックしておらず、現在のユーザーをブロックしていないすべてのユーザーのコレクションを返したいと思います。

現在、呼び出し@user.available_usersて実行する次のコードがありますが、3 つのクエリを実行します。これを単一のクエリにする方法はありますか?

class User < Sequel::Model

  one_to_many :blocked_users,     :key=>:source_id
  one_to_many :blocked_by_users,  :key=>:target_id, :class => BlockedUser

  def block_user(id)
    BlockedUser.create({source_id:self.id, target_id:id})
  end 

  def blocked_user_ids
    self.blocked_users.map{|bu| bu[:target_id]}
  end 

  def blocked_by_user_ids
    self.blocked_by_users.map{|bu| bu[:target_id]}
  end 

  def available_users
    User.exclude(:id=>self.blocked_users.map{|bu| bu[:target_id]}).exclude(:id=>self.blocked_by_users.map{|bu| bu[:target_id]})
  end 
end

User クラスに次のメソッドを追加しました。

  def test_avail
    User.exclude(:blocked_users=>self).exclude(:blocked_by_users=>self)
  end 

1.9.3p0 :001 > User.all.first.test_avail
   INFO - (0.000732s) SELECT * FROM `users`
Sequel::Error: invalid association class User for association :blocked_users used in dataset filter for model User, expected class BlockedUser
4

1 に答える 1

2

関連付けサポートによるフィルターを使用するのがおそらく最も簡単です。

def available_users
  User.exclude(:blocked_users=>self).exclude(:blocked_by_users=>self)
end
于 2012-06-28T17:50:28.163 に答える