0

has_many/belongs_to 関連付けを介して接続されている 2 つのモデルがあります。

Class Project < ActiveRecord::Base
  has_many :tasks
end

Class Tasks < ActiveRecord::Base
  belongs_to :project
end

各タスクは、HABTM 関係でタグ付けされています。

Class Tasks < ActiveRecord::Base
  belongs_to :project
  has_and_belongs_to_many :tags
end

タグ ID に基づいてプロジェクトのリストを取得しようとしています。Projectモデルでクラス メソッドを使用して、特定のタグを持つタスクを持つプロジェクトのリストを取得できます。

def by_tag(tag_id)
  Project.joins(:tasks => :tags).where(:tags => {:id = tag_id})
end

理想的には、ビュー内の特定のタグのすべてのプロジェクトとそれに関連するタスクを一覧表示できるようにしたいと考えています。project.tasksのようなプロジェクトで典型的な検索を使用した場合、通常、特定のプロジェクトに属するタスクのリストを取得できますProject.find(1)

ただし、project.tasks新しいクラス メソッドを使用して見つかった結果を試すとProject.by_tag(1)、"NoMethodError: Undefined Method 'tasks'" エラーが発生します。

タグによるプロジェクトの結果を得るために名前付きスコープを調べましたが、人々はそのアプローチから離れてクラス メソッドを支持しているようです。本当?

4

1 に答える 1

1

プロジェクト モデルでは、インスタンスではなくクラスに追加する必要があります。また、これにより自己オブジェクトがクラスに昇格されるため、「プロジェクト」を削除できることに注意してください。明確にしたい場合を除きます。

class << self
  def by_tag(tag_id)
    joins(:tasks => :tags).where(:tags => {:id = tag_id})
  end
end

どの方法が最善かについては、常に議論があります。私自身は、仕事が早く終わるものは何でも好みます。私は個人的にスコープが好きですが、それぞれにスコープがあります。

于 2012-07-22T20:36:03.810 に答える