私はユーザー、提案、および検索を含む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
唯一の方法は、Favorite
にsearch_id
属性を追加することです。しかし、これは、お気に入りには検索に属する提案に属し、お気に入りは検索に直接属しているため、お気に入りテーブルを正規化しません。
私が考えることができる唯一のアイデア(私はこれをまだ実装しようとしていないが、私が頭の中で私を導く場所を視覚化するのに困っている)は、 UserモデルとSearchモデルではなく、UserとSearchの間の結合モデルを使用します(これは、テーブルを非正規化するためです)。
これを設計するにはどうすればよいですか?
質問は長らく残念です。
ああ、私はあなたの質問に誤解しました。編集され、修正されました。 –
編集#2:実際には関連付けの拡張は必要ありません。 Rails 3&Arel以降、関連付けの後にスコープを連結することができます。 –
非常に良い。これが私が探していた解決策です。ありがとうございました。 –