2

これを行うにはいくつかの方法が考えられますが、何を選択すればよいかわかりません。

私はクラスを持っており、Topicこれをスコープして、関連付けられたオブジェクトがある場合、Replyまたはtopic.repliesカウントが0より大きい場合にのみトピックを返すようにしています。

これを行うための最悪の方法:

@topics.select{ | topic | topic.replies > 0 && topic.title == "Conversation" }

where理想的には、スコープを使用したいと思います。

  scope = current_user.topics
  scope = scope.joins 'left outer join users on topics.registration_id = registration_members.registration_id'
  # scope = .. here I want to exclude any of these topics that have both the title "Conversations" and replies that are not greater than 0

これらの選択を、すでに選択されている他のものに「追加」する必要があります。したがって、私の選択では、他のすべてをこの選択だけに除外するべきではありません。Topic返信が1つ未満で、「会話」とも呼ばれるものは、最終的な返品から除外する必要があると言っているだけです。

何か案は?

アップデート

半ハッシュのアイデアのようなもの:

items_table = Arel::Table.new(scope)
unstarted_conversations = scope.select{|a| a.title == "Conversation" && a.replies.count > 0}.map(&:id)
scope.where(items_table[:id].not_in unstarted_conversations)
4

1 に答える 1

1

count cacheと呼ばれるものを使用できます。基本的には、フィールドをテーブルに追加し、そのフィールドに指定されたタイプの「関連付け」の合計を格納し、自動的に更新します。

この古い screen/ascii キャストをチェックしてください: http://railscasts.com/episodes/23-counter-cache-column?view=asciicast

ここに新しいものがあります:http://hiteshrawal.blogspot.com/2011/12/rails-counter-cache.html

あなたの場合は次のようになります:

# migration
class AddCounterCacheToTopìc < ActiveRecord::Migration
  def self.up
    add_column :topics, :replies_count, :integer, :default => 0
  end

  def self.down
    remove_column :topics, :replies_count
  end
end

# model
class Replay < ActiveRecord::Base
  belongs_to :topic, :counter_cache => true
end

それがあなたを助けることを願っています。

于 2012-12-12T21:09:27.060 に答える