Hello List I have a Milestone model as follows: class Milestone < ActiveRecord::Base belongs_to :goal belongs_to :user has_many :progresses, :order => ''created_at DESC'' has_many :views Which has an association with a model called views: class View < ActiveRecord::Base set_primary_keys :milestone_id, :user_id belongs_to :user belongs_to :milestone The logic goes as follows: Each milestone belongs only to one user, but may be viewed by many users. The views are there to track when last a user viewed a milestone (whether the milestone belonged to the user viewing it, or to another user). When the user goes to the "milestones" UI, I want to display all milestones (including those that haven''t been viewed by the user at all). I also want to track when last, if at all, the currently logged in user has viewed each milestone. Because I will have many milestones and many users, it seems rather wasteful to pull all the views for each milestone, and then loop through the views looking for a view belonging to the current user. What I would like to do is pull all the milestones, plus any views for the currently logged in user (the @user object stores the logged in user''s details). In raw SQL, this translates to something like: SELECT milestones.name, views.view_time FROM milestones LEFT JOIN views ON views.milestone_id = milestones.id WHERE views.user_id = #{@user.id} /* Currently logged in user */ I would prefer to avoid using the raw SQL avenue if possible, so does anybody have any suggestions as to how to achieve this with Rails? Regards Rory --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
> In raw SQL, this translates to something like: > > SELECT milestones.name, views.view_time > FROM milestones LEFT JOIN views ON views.milestone_id = milestones.id > WHERE views.user_id = #{@user.id} /* Currently logged in user */ >Create the view in the database, and attach a model to it. From the Rails perspective, it''s just another model. migration: self.up sql = "CREATE OR REPLACE VIEW `milestoneview` AS SELECT" sql += "`m`.`milestone_id` AS `milestone_id`" sql += "`v`.`view_time` AS `view_time`" # add whatever other fields may be useful sql += "FROM milestones m" sql += "LEFT JOIN views v ON v.milestone_id = m.id" execute sql end save the WHERE to be applied in the Rails app as an adder to your find method just like a regular table model: class Milestoneview < ActiveRecord::Base belongs_to :goal belongs_to :user has_many :progresses, :foreign_key => ''milestone_id'', :order => ''created_at DESC'' has_many :views, :foreign_key => ''milestone_id'' end and off you go (or something close to the above) -- 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 -~----------~----~----~----~------~----~------~--~---
Ar Chron wrote:> >> In raw SQL, this translates to something like: >> >> SELECT milestones.name, views.view_time >> FROM milestones LEFT JOIN views ON views.milestone_id = milestones.id >> WHERE views.user_id = #{@user.id} /* Currently logged in user */ >> > > Create the view in the database, and attach a model to it. From the > Rails perspective, it''s just another model.<snip> Thanks Ar That was a route I hadn''t thought of, and definitely one that I will consider for both this problem and future problems of a similar nature. As a quick fix, I decided just to split the views out of the model, and retrieve them on their own using View.find. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---