0

Railsでクエリを実行する「(xAND y)OR(a ANDb)」を作成する最良の方法は何ですか?

2人のユーザー間でメッセージを返すために次のmessagesメソッドを作成しました。選択は、2人のユーザー間でメッセージを取得することです。つまり、私から彼らへ、そして彼らから私へのメッセージを私に与えます

それは動作しますが、恐ろしいように見えます。これを書くためのより簡単でより良い方法はありますか?

class Conversation
  def initialize(me, them)
    @me = me
    @them = them
  end

  def messages
    t = Message.arel_table
    results = Message.where(
      (t[:sender_id].eq(@me.id).and(t[:recipient_id].eq(@them.id))).or(
      t[:sender_id].eq(@them.id).and(t[:recipient_id].eq(@me.id)))
    )
  end
end

注ジミーのおかげで、私は次のようになりました。

class Conversation
  def initialize(me, them)
    @me = me
    @them = them
  end

  def messages
    me_to_them = "sender_id = :my_id AND recipient_id = :their_id"
    them_to_me = "sender_id = :their_id AND recipient_id = :my_id"
    Message.where(
      "#{me_to_them} OR #{them_to_me}",
      {:my_id => @me.id, :their_id => @them.id}
    )
  end
end
4

3 に答える 3

1

SQL文字列と値補間の配列構文を使用して、少しクリーンアップできます。

class Conversation < ActiveRecord::Base
  def initialize(me, them)
    @me = me
    @them = them
  end

  def messages
    Message.where(["(sender_id = ? AND recipient_id = ?) OR (sender_id = ? AND recipient_id = ?)", @me.id, @them.id, @them.id, @me.id])
  end
end
于 2012-03-25T10:11:56.997 に答える
0

私は以前にこれと同様のシステムを構築しました。私のデータベースは少し異なった構造になっていますが、クエリを簡単にし、グループでの会話を可能にします(2人以上)

private_message_groups 
id | subject

private_message
id | group_id | private_message_group_id | user_id | message

private_message_follow
group_id | user_id | visible 

このようにして、ユーザーをprivate_messageコントローラーにポイントするだけです。もっと深く掘り下げてほしいのなら、私はできますが、このシステムの最大の利点は、フォーラムシステムがあることです。

于 2012-03-23T18:03:51.087 に答える
0

私も同じ問題を抱えていました。私は数時間ウェブを検索していましたが、最終的にArel :: FactoryMethodsでgroupingという名前のメソッドを見つけました。これは、式の前後に角かっこを追加するだけです。

これを使用すると、メソッドは次のようになります。

def messages
  t = Message.arel_table
  results = Message.where(
    t.grouping(t[:sender_id].eq(@me.id).and(t[:recipient_id].eq(@them.id))).or(
    t.grouping(t[:sender_id].eq(@them.id).and(t[:recipient_id].eq(@me.id))))
  )
end
于 2013-03-01T16:39:55.460 に答える