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属性 on来完成Suggestion

我试图Favorite在用户和建议之间建立一个连接模型。

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

我能想到解决这个问题的唯一方法是search_idFavorite. 但是,这会使我的收藏夹表反规范化,因为收藏夹属于属于搜索的建议,而收藏夹也直接属于搜索。

我能想到的唯一其他想法(我还没有尝试实现这一点,我无法想象它会在我的脑海中引导我到哪里)是用户最喜欢的关联应该通过连接模型发生在 User 和 Search 之间,而不是分别在 User 和 Search 模型上(因为这会使表格反规范化)。

构建这个的最佳方法是什么?

对于这个问题的冗长性质,我深表歉意。

4

1 回答 1

1

您可以使用范围来执行此操作,而无需实现suggestions_favoured_by手动进行过滤的方法。

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

然后访问用户对特定的最喜欢的建议search

search.suggestions.favoured_by(user_id)

Rails 将负责构建 SQL 查询,并且您的关联保持规范化。

于 2012-04-30T00:21:55.497 回答