2

ダイジェストメーラーの目的で、ユーザーが自分のアプリを見ることができる回答を取得したいと考えています。

ユーザーは、すでに購読しているすべてのグループから、投票数が最も多い 5 つの回答のみを表示する必要があります。

協会:

Answer
  # Returns 5 the most voted answers
  #
  scope :best, order("votes_count DESC")

  belongs_to :user
  belongs_to :group
User
  belongs_to :group
  has_many :answers, :dependent => :destroy
  has_many :groups, through: :subscriptions
Group
  has_many :subscriptions
  has_many :users, through: :subscriptions
  has_many :questions
  has_many :answers

だから私はこれを行うための最良の方法を探しています:

class BestAnswers
  def self.for_user(user)
    answers = []
    user.groups.each |group|
      answers << group.answers
    end
    return answers  
  end
end
4

2 に答える 2

2

古典的なアプローチは次のとおりです。

class BestAnswers
  def self.for_user(user)
    Answer.where(:group_id => user.groups).best.limit(5)
  end
end

ただし、Rails 3.1以降のAFAIKhas_manyはチェーンをサポートしています。これをテストして報告できますか?

#User model: has_many :group_answers, :through => :groups

user.group_answers.best.limit(5)
于 2012-12-10T16:19:33.613 に答える
0

私には、このコードは新しいクラスではなくユーザーモデルに属しているように見えます。

# app/models/user.rb
class User < ActiveRecord::Base
  # Return the five best answers for a user
  def best_answers
    groups.each_with_object([]) do |group, array| 
      array << group.answers.best.limit(5)
    end
  end
end

更新された仕様については、トークランドの答えは本当に素晴らしい方法のように見えます。

于 2012-12-10T15:44:42.653 に答える