Hi Guys, First off: Rails is amazing:  Thanks! I''ve been trying unlearn
everything I know about web development and it is tricky - I''m not used
to things being beautiful :)
Anyway, I think I might be over complicating this but I''m working on a
project that tracks progress towards earning an award.  Each award has
several groups of tasks and each group has one or more tasks.  I have
defined the Award class below:
Class Award < ActiveRecord::Base
  has_many :task_groups
  has_many :tasks, :through => :task_groups
end
The completed tasks for each user is tracked in a table called
completed_tasks.  And I want to show how many tasks the user has
completed for a particular award (and how many remain).
Here is what I tried:
Class Award < ActiveRecord::Base
  has_many :task_groups
  has_many :tasks, :through => :task_groups
  has_many :completed_tasks, :through => :tasks
   def completed_tasks_for_user(user)
     completed_tasks.find_by_user_id(user.id)
   end
end
Class Task < ActiveRecord::Base
  has_many :completed_tasks
end
I was hoping that Active record would join awards to task_groups, then
to tasks, then to completed_tasks but the generated SQL was:
SELECT completed_tasks.* FROM completed_tasks  INNER JOIN tasks ON
completed_tasks.task_id = tasks.id    WHERE ((tasks.award_id = 3)) AND
(`completed_tasks`.`user_id` = 1)  LIMIT 1
There is no award_id in the tasks table so the above statement doesn''t
work.  It needs to go through the task_group table first.
I know I could iterate through the tasks and get the completed tasks for
a user that way but thought there might be a more ruby-licious way.  Any
ideas?
-- 
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Why not just have an extra field in the Task model called completed 
(boolean). Next, create a method in the Task model that looks something 
like this:
def tasks_completed_by_user(user)
  find(:all, :conditions => {"user_id =
''#{user}''", "completed =
''1''")
end
That would give you a collection of Tasks that are marked completed.
Now I am a ROR newbie so the code above may need some tweaking... but 
you get the idea.
Dan Hixon wrote:> Hi Guys, First off: Rails is amazing:  Thanks! I''ve been trying
unlearn
> everything I know about web development and it is tricky - I''m not
used
> to things being beautiful :)
> 
> Anyway, I think I might be over complicating this but I''m working
on a
> project that tracks progress towards earning an award.  Each award has
> several groups of tasks and each group has one or more tasks.  I have
> defined the Award class below:
> 
> Class Award < ActiveRecord::Base
>   has_many :task_groups
>   has_many :tasks, :through => :task_groups
> 
> end
> 
> The completed tasks for each user is tracked in a table called
> completed_tasks.  And I want to show how many tasks the user has
> completed for a particular award (and how many remain).
> 
> Here is what I tried:
> 
> Class Award < ActiveRecord::Base
>   has_many :task_groups
>   has_many :tasks, :through => :task_groups
>   has_many :completed_tasks, :through => :tasks
> 
>    def completed_tasks_for_user(user)
>      completed_tasks.find_by_user_id(user.id)
>    end
> end
> 
> Class Task < ActiveRecord::Base
>   has_many :completed_tasks
> 
> end
> 
> I was hoping that Active record would join awards to task_groups, then
> to tasks, then to completed_tasks but the generated SQL was:
> 
> SELECT completed_tasks.* FROM completed_tasks  INNER JOIN tasks ON
> completed_tasks.task_id = tasks.id    WHERE ((tasks.award_id = 3)) AND
> (`completed_tasks`.`user_id` = 1)  LIMIT 1
> 
> There is no award_id in the tasks table so the above statement
doesn''t
> work.  It needs to go through the task_group table first.
> 
> I know I could iterate through the tasks and get the completed tasks for
> a user that way but thought there might be a more ruby-licious way.  Any
> ideas?
-- 
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
On Jan 6, 9:30 pm, Melvin Ram <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> Why not just have an extra field in the Task model called completed > (boolean). Next, create a method in the Task model that looks something > like this:I''m with Melvin. Ideally, an object/entity shouldn''t change its class/ table just because its state has changed. ///ark --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Thanks for the replies Mark and Melvin.
Since the tasks can indirectly belong to many users at once I couldn''t 
simply add a completed boolean to that class.  ("Run a mile under 6 
minutes" might be completed by Jeremy but not yet by Alex).
I ended up adding this method to my user model:
def completed_tasks_in_current_award
    tasks = []
    completed_tasks.each do |ct|
      if ct.task.task_group.award == award
        tasks << ct.task
      end
    end
    tasks
end
I''m guessing there might be a way to do it with more code - but this 
will suffice for now.
-- 
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---