2017-02-08 4 views
1

2人のユーザー間でメッセージのカプセル化を維持する会話モデルのスコープがあります。私は、2つのユーザーオブジェクトから「会話」を検出するのに役立つスコープを作成しました。データベースアゴニストまたはQuery in Rails 4.2アクティブレコード

私が持っていた。しかし

validates_uniqueness_of :from, scope: :to 
scope :between, -> (from,to) { where('("conversations"."from" = ? AND "conversations"."to" = ?) OR ("conversations"."from" = ? AND "conversations"."to" = ?)', from, to, to, from) } 

、これはSQLiteのとPostgresのために働いている間。それはMySQLのために働いていませんでした。私はこの明示的なクエリを完全にデータベースにとらわれないものにするか、代わりにアクティブなレコード関係から作成する必要があります。

私は「.OR」を使用して自分自身をそれをやっでショットを持っていたが、私は、これはRailsのからのみ利用可能である疑い5+私はそれを使用しようとしたとき、それは私に未定義のメソッドエラーを与えたので。

代わりに私が使用している:

validates_uniqueness_of :from, scope: :to 
scope :between, -> (from,to) { where(from: [from, to], to: [to, from]) } 

をこのコードは偉大な(とその実際に本当に速いと簡潔)動作しますが、私はそれが「弱い」かもしれないと心配しています - その中で技術的には、状況に応じて可能性がありますwhere from == from、to == from - 私のアプリケーションでは不可能であるはずです。

「X」と「Y」の間に会話が作成された場合は、from: X and to: Y = conversation_id: 3とYメッセージXの場合は、conversation_id:3が見つかるはずです(意味的には同じなので)。

あるようスコープ 'の間の新しいを残して、どのように私はレコードが作成されるときfrom != toが(そしてクエリが潜在的に見つけることができるということは問題ではないことを確実にするための検証を強化することができ、十分幸せイム同じユーザーとの会話)。

+0

どのように? – emaillenin

+0

私は – Ash

答えて

1

あなたは次にとしてあなたのスコープを書くrails_or、Railsの3、4の方法を#orサポート宝石、5

を試みることができる:カスタムアクティブレコードの検証を追加する方法について

scope :between, -> (from,to) { where(from: from, to: to).or(from: to, to: from) } 
+0

うん、私は別の宝石せずにこれをやってみたかった....ことをやったことがありません。 – Ash

+0

#orがRails 5に追加されたばかりなので、以前は生のクエリを書く必要があるかもしれません。 –

+0

私はRails 5にアップグレードしましたが、これはもはや問題ではありませんでした。 – Ash