のようなあなたは3つの機種のために設定した関係を知らなくても、それは完全な応答を与えるには少し難しいです。以下は1つのシナリオです。
ユーザーからの要求を表示するかどうかを判断しようとしています。 これは、ログインしているユーザ(current_user
と呼ぶことができます)が要求ユーザをブロックしたかどうかによって異なります(requestor
と呼ぶことができます)。ブロックされたユーザーは、ブロックされたテーブルにあります。
あなたは、最初のユーザーがブロックされているかどうかを確認するために、ブロックテーブルを照会できますが見つかった場合、ブロックオブジェクトを返します
Block.find_by(blocked_id: requestor.id, blocker_id: current_user.id)
を、それ以外の場合はnil
を返します。これを変数に設定すると、ユーザーのブロックされた状態が得られます。おそらくコントローラーの動作に最適です。
class RequestsController << ApplicationController
def show
@blocked_status = Block.find_by(blocked_id: requestor.id, blocker_id: current_user.id)
@request = Request.find_by(request_from_id: requestor.id, request_to_id: current_user.id)
end
end
次に、あなたはどちらかにあなたのビューでその情報を使用requests.html.erb
<% unless @blocked_status %>
# html to display request from requestor to current_user
<% end %>
それとも
何かで要求を見つけるために、スコープを使用して、要求か
を表示することができますlike:
scope :not_blocked_by, -> (user_id) {
joins("JOIN `blocks` b ON b.`blocked_id` = `requests`.`request_from_id` AND b.`blocker_id` = #{current_user.id}")
.where.not('b.blocked_id = :user_id', user_id: user_id)
}
である。
class RequestsController << ApplicationController
def show
@request = Request.not_blocked_by(@requestor.id)
end
end
私がやりたいこと、返信用のおかげで、Request.whereです(:blocker_id => current_user.id、:Block.where(blocked_id => requests.user_id).exists.not)どのように私はそれを行うことができます? –
私はスコープを使用して、 'Request'の後のすべてを処理します。 Blockに参加するスコープ内にクエリを作成する必要があります。これは上記のスコープと似ていますが、 '.exists? 'を使いたい場合は少し変更する必要があります。スコープに関する詳細と例については、[Rails API Guide on Scopes](http://guides.rubyonrails.org/active_record_querying.html#scopes)をお試しください。 –