0

私はユーザー、提案、および検索を含むRailsアプリケーションを持っています。ユーザーと検索の間には、各ユーザーが多数の検索を行うことができ、各検索に多数のユーザー(「検索ユーザー」と呼ばれる)が存在するような多対多の関連があります。アイテムを優先するデータベースモデル。

ユーザーは、それぞれのメンバーの検索に提案をすることができます。したがって、各示唆はユーザーと検索に属します。

class Suggestion < ActiveRecord::Base 
    belongs_to :suggester, class_name: 'User' 
    belongs_to :search 
end 

class Search < ActiveRecord::Base 
    # ... user-search associations. 

    has_many :suggestions 
end 

class User < ActiveRecord::Base 
    # ... user-search associations. 

    has_many :suggestions, foreign_key: :suggester_id 
end 

今、私は彼らがのメンバーである検索に作られています好きな提案をユーザーに許可しようとしています。困っているのは、チームメイトが作った好きな提案や、自分が作った提案ができることです。つまり、簡単なfavorite属性(Suggestion)ではお気に入りを達成できません。

私はFavoriteをUserとSuggestionの間の結合モデルにしようとしました。

class Favorite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :suggestion 
end 

しかし、特定の検索内から特定のユーザーが好んだ提案にアクセスするのに問題があります。例えば:私はこの問題を解決するために考えることができます

class Search < ActiveRecord::Base 
    has_many :suggestions 

    def suggestions_favoured_by(user) 
    # here I need to grab the search's suggestions and then scope them 
    # down to only these that have an entry in the favorites table which 
    # has user_id == user.id. 
    # That seems ridiculously complicated. 
    end 
end 

唯一の方法は、Favoritesearch_id属性を追加することです。しかし、これは、お気に入りには検索に属する提案に属し、お気に入りは検索に直接属しているため、お気に入りテーブルを正規化しません。

私が考えることができる唯一のアイデア(私はこれをまだ実装しようとしていないが、私が頭の中で私を導く場所を視覚化するのに困っている)は、 UserモデルとSearchモデルではなく、UserとSearchの間の結合モデルを使用します(これは、テーブルを非正規化するためです)。

これを設計するにはどうすればよいですか?

質問は長らく残念です。

答えて

1

フィルタリングを手動で行うsuggestions_favoured_byメソッドを実装せずに、スコープでこれを行うことができます。そして、特定のsearchのユーザーのお気に入りの提案をアクセスするための

class Suggestion < ActiveRecord::Base 
    has_many :favorites 
    scope :favoured_by, lambda { |user_id| 
    joins(:favorites). 
    where(:favorites => {:user_id => user_id}) 
    } 
end 

search.suggestions.favoured_by(user_id) 

Railsは、SQLクエリを構築するの世話をする、との関連付けは、正規化されたままです。

+0

ああ、私はあなたの質問に誤解しました。編集され、修正されました。 –

+0

編集#2:実際には関連付けの拡張は必要ありません。 Rails 3&Arel以降、関連付けの後にスコープを連結することができます。 –

+0

非常に良い。これが私が探していた解決策です。ありがとうございました。 –