Hi there !
Consider the following 2 initial models:
========================================
project:
has_many :tasks
task:
belongs_to :project
My question:
Is there a way in Rails to define some sort of a “sub model”, like this?
(And if yes, how exactly?)
project:
has_many :tasks
has_many :unfinished_tasks, :class => ‘task’, :conditions => {
:unfinished => true }
task:
belongs_to :project
Thanks for any help with this!
Tom
On 6 Apr 2008, at 18:29, Tom Ha wrote:
has_many :unfinished_tasks, :class => ‘task’, :conditions => {
:unfinished => true }
Apart from the fact that the option for specifying the class name
is :class_name and not :class, what you’ve got there should already
work.
Fred
Oh, very cool, thanks Fred!
On Sun, Apr 06, 2008 at 07:29:59PM +0200, Tom Ha wrote:
Consider the following 2 initial models:
project:
has_many :tasks
[…]
My question:
Is there a way in Rails to define some sort of a “sub model”, like this?
(And if yes, how exactly?)
project:
has_many :tasks
has_many :unfinished_tasks, :class => ‘task’, :conditions => {
:unfinished => true }
[…]
I generally like to define methods on the has_many collection for that
sort
of thing:
has_many :tasks do
def unfinished
select(&:unfinished?)
end
end
This allows you to call @project.tasks.unfinished to get the collection
of
unfinished tasks. That said, if you are trying to avoid retrieving or
instantiating the finished tasks, use the other approach with the
conditions clause. This approach requires loading (or having loaded) the
entire tasks collection.
Thanks for any help with this!
Tom
–Greg
It should be :class_name => “Task” and not :class_name => “task”. If you
left it lower case you’d get Rails whinging that it can’t find a local
variable called “task”, which can lead to a lot of wtf’ing before
figuring
that out.