0

タグとタスクのタグ付けシステムがあります (タグには TagTask を介して多くのタスクがあり、その逆も同様です)

私がやりたいのは、すべてのタグが提供するすべてのタスクを返すスコープを作成することです。したがって、Tag モデルでは、次のようになります。

def self.combined_tasks(tag_ids)
    tasks = []
    tag_ids.each do |tag_id|
      tasks << self.find(tag_id).tasks
    end

    tasks.inject { |result, elem| result & elem }
end

問題は、これを効率的に行うために Task モデル内にスコープを作成する連鎖可能な方法が思いつかないことです。経由でタグモデルにパームオフする

def self.in_all_tags(tags_ids)
  tags = Tag.combined_tasks(tag_ids)
end

動作しますが、当然のことながら、他のスコープにチェーン可能ではないようです。

任意の提案をいただければ幸いです

4

1 に答える 1

0

試す:

Task.joins(:tag_tasks).where(tag_tasks: {tag_id: tag_ids}).uniq
于 2012-09-13T19:16:35.320 に答える