2012-12-19 9 views
12

基本的に、独自のアソシエーションタイプを定義する共通のアプローチがあるかどうかを知りたいと思います。 いくつかの詳細:カスタムレールhas_many association(pg配列を介して)

私はモデルconversationsにPG配列の列user_idsを持っています。 select conversations.* from conversations where USER_ID = ANY(conversations.user_ids)

finder_sqlので、それの友人が廃止されて、私は本当にこの擬似にhas_manyの関連付けを実施するための最良の方法だろうかを知りたい: ので、利用者の会話を取得するために私が実行する必要がありますか?だから、基本的に私はActiveRecord::Associations::CollectionAssociation自分自身を実装すると思っていますし、いくつかの良い参照がそこにいるかどうかを知りたいのか、アドバイスできればどこから始めれば

def conversations 
    Conversation.where("#{id} = ANY (conversations.users)") 
end 

は、現在、私は同じような方法を使用します

Conversation.user.select{ |conversation| conversation.user_ids.include?(params[:id]) 

コン:


+0

あなたはスキーマを制御できますか?私は外部キーを保持するために配列を使用するのは悪い習慣であり、今あなたを引き起こしているトラブルのためだけではないので、私は尋ねます。配列を使用することを考慮する必要があるのは、いつもデータベースに意味を持たない不可分なものとして扱うことができるときだけです。 –

+3

そうですね、私は教育的目的のためにこのアプローチをとることに決めました。さらに、私はアレイの性能には全く驚いています。私に納得させたもう1つの事はこれでした:http://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/、それでは、それほど悪い考えではないと思っていたのですが、後で –

+0

あなたはおそらくあなたもSQLビューに行くことができるARRAYと一緒に行くことにしましたか? https://github.com/thoughtbot/scenicそして、基本的にあなたの配列を非正規化する別のテーブルを作成してください:(conversation_id、user_id)(many-many)そうすればnormalを使うことができます。 –

答えて

0

いかがで現在のユーザIDはparams [:id]によって渡されます。

主なアプローチは、配列を持っている場合には、何か内部に.include? ) 方法。このように考えると、selectメソッドを使用して、実際にこの配列内のIDを持つオブジェクト(この場合はユーザー)をincludeメソッドで選択できます。私は明確ですか?

has_many :conversations, ->(user) { where("#{user.id} = ANY (conversations.users)") } 

それは最終的にかかわらず、同じいずれかの方法でなければなりません:それは働いていた場合

は、私はあなたが基本的には関連してメソッドのコードを置くことができると思います...

0

を教えてください。あなたのメソッドは、連鎖できるリレーションを返します。もう1つの選択肢は次のようなものです:

has_many :conversations, -> { where('users.id IN conversations.users') } 

しかし、新しい結合表を追加できない理由はありますか?これをconversations_usersテーブルに移行するのが理想的です。次に、テーブルにきれいに参加し、外部キーの制約を利用できます。