2016-06-20 18 views
0

私はrails4でWebアプリケーションを開発しています。Ruby on railsクエリの問題

私はuser、block、およびrequestテーブルを持っています。 ブロックにはblocker_idとblocked_idがあります。 一部のユーザーには要求があり、一部のユーザーは他のユーザーをブロックできます。

一部のユーザーによって作成され、別のユーザーをブロックしていない要求エンティティを取得したいとします。

u1によって作成されたr1があるとします。u2がu1をブロックしていない場合、u2はr1を取得します。

Request.where(「U2によってブロックされていないrequests.user_id」)

答えて

0

のようなあなたは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 
+0

私がやりたいこと、返信用のおかげで、Request.whereです(:blocker_id => current_user.id、:Block.where(blocked_id => requests.user_id).exists.not)どのように私はそれを行うことができます? –

+0

私はスコープを使用して、 'R​​equest'の後のすべてを処理します。 Blockに参加するスコープ内にクエリを作成する必要があります。これは上記のスコープと似ていますが、 '.exists? 'を使いたい場合は少し変更する必要があります。スコープに関する詳細と例については、[Rails API Guide on Scopes](http://guides.rubyonrails.org/active_record_querying.html#scopes)をお試しください。 –