0

I have three models:

Class Project < ActiveRecord::Base
  has_many :tasks
  has_many :tags, :through => :tasks
end

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

Class Tags < ActiveRecord::Base
  has_and_belongs_to_many :tasks
  has_many :projects, :through => :tasks

When I open up console, I can get my Project and Task information as expected:

Tag.find(1).projects
Tag.find(1).tasks

If I want, I can get all the tasks for each project regardless of the tag:

Project.find(1).tasks

For whatever reason, I can't access tasks if I get projects by tag... something = Tag.find(1).projects something.tasks

...I get the error:

undefined method `tasks' for #<ActiveRecord::Relation:0x007feae4af0e70>

I've looked for a couple hours and can't find anything that corrects this problem. Based on everything I've found, it should be working... but it's not.

I'm using Rails 3.2.3.

4

1 に答える 1

1

Tag.find(1).tasksあなたに同じ結果を与えるべきではありませんか?

とにかく、あなたが直面している問題はRelation、モデルのインスタンスではなく、オブジェクトから関連付けを取得しようとしていることです。Relationsクエリ条件を連鎖させるために使用できますが、それらから関連付けを直接参照することはできません。したがって、例を機能させるには、次のことを行う必要があります。

p = Tag.find(1).projects.includes(:tasks)

次に、次のようなタスクを参照しますp[0].tasks

ただし、それTag.find(1).tasksが同じSQLを生成し、最終的に同じコレクションを返すことを確認しますtasks

于 2012-07-23T07:21:14.233 に答える