I have a time tracking application.
An Hour belongs_to a Project. And a Project belongs to a ProjectStatus and thus has a field project_status_id.
Now I want to scope my Hour model to filter all hours that belong to projects with a certain status, e.g. 2.
In my Project model I have this scope:
#project.rb
scope :continous, where(:project_status_id => '2')
In my Hour model I tried the following scope but it always returns an empty array, also I know there are hours that math my criteria:
#hour.rb
scope :intern, joins(:project) & Project.continous
also I think the generated SQL output on the console looks a little strange:
1.9.2-p180 :003 > Hour.intern
Hour Load (104.5ms) SELECT `hours`.* FROM `hours` INNER JOIN `projects` ON `projects`.`id` = `hours`.`project_id`
Project Load (6.1ms) SELECT `projects`.* FROM `projects` WHERE (project_status_id <> 2)
Hour Load (95.9ms) SELECT `hours`.* FROM `hours` INNER JOIN `projects` ON `projects`.`id` = `hours`.`project_id`
Project Load (1.0ms) SELECT `projects`.* FROM `projects` WHERE `projects`.`project_status_id` = 2
Hour Load (92.6ms) SELECT `hours`.* FROM `hours`
=> []
Why is there one query with WHERE (project_status_id <> 2) and one with WHERE 'projects'.'project_status_id' = 2 ?
Is he trying to subtract the two from each other ?
Any hints how to make this scope work.. ?
thanks
Not sure if this is the most elegant approach, but you can merge relation objects:
Note that I’m wrapping it in a lambda so Project.continuous is not executed when the application loads. Also, this is the preferred way to define scopes in future versions of Rails.