11155
(-- --)
June 30, 2012, 5:36pm
1
Hello guys, I have two tables, tasks and projects, and each model I put:
Task.rb
class Task < ActiveRecord::Base
attr_accessible :user_id, :project_id, :name
belongs_to :project
end
Project.rb
class Project < ActiveRecord::Base
attr_accessible :name, :description
has_many :tasks
end
But when I go to my prompt and I make a SELECT with task, none project
is returned.
irb(main):001:0> Task.all
←[1m←[36mTask Load (0.0ms)←[0m ←[1mSELECT `tasks`.* FROM `tasks` ←[0m
←[1m←[35mEXPLAIN (30.0ms)←[0m EXPLAIN SELECT `tasks`.* FROM `tasks`
EXPLAIN for: SELECT `tasks`.* FROM `tasks`
hassan
(Hassan Schroeder)
June 30, 2012, 6:02pm
2
irb(main):001:0> Task.all
=> [#<Task id: 1, user_id: nil, project_id: 1, name:
"W\r<br>T\r<br>F\r<br>VERY\r<br...", del
eted: 0, done: 0, created_at: "2012-06-24 15:46:37", updated_at:
"2012-06-30 17:13:27">, #<Task id: 2, user_id: nil, pro
ject_id: 1, name: "Teste", deleted: 0, done: 0, created_at: "2012-06-30
17:11:27", updated_at: "2012-06-30 17:11:27">]
I guess the project name should come too ? right ?
Wrong.
What am I doing wrong ?
Misunderstanding ActiveRecord and associations
Revisiting the relevant Rails guides might be a good idea.
Nothing. The project will only be fetched if you use :include in the
query. However, for one of the tasks fetched above you can still say
task.project and it will fetch the project then.
Colin
11155
(-- --)
June 30, 2012, 11:17pm
4
Hello Colin, thank you for your answer..
I tryed this:
irb(main):001:0> task = Task.all
←[1m←[36mTask Load (1.0ms)←[0m ←[1mSELECT `tasks`.* FROM `tasks` ←[0m
←[1m←[35mEXPLAIN (1.0ms)←[0m EXPLAIN SELECT `tasks`.* FROM `tasks`
EXPLAIN for: SELECT `tasks`.* FROM `tasks`
hassan
(Hassan Schroeder)
July 1, 2012, 12:24am
5
irb(main):001:0> task = Task.all
Model.all is clearly intended to return multiple results; it would be
more appropriate to say `tasks = Task.all`
irb(main):002:0> task.project
NoMethodError: undefined method `project' for #<Array:0x482b068>
in which case you would be calling e.g.
tasks.first.project
or
tasks.each{ |task| puts task.project.inspect }
or whatever
11155
(-- --)
July 1, 2012, 1:43am
6
Thanks a lot Hassan, I tryed with tasks.first.project and everything is
OK.
Thanks again.