Brent Miller
2008-Feb-29 18:23 UTC
Finding parent records without has_many :through association
Hi all,
Here''s an interesting problem. I''ve got a reasonably complex
set of
models to represent a college campus housing lottery.
class Dorm
has_many :rooms
has_many :room_assignments, :through => :rooms
end
class Room
belongs_to :dorm
has_many :room_assignments
end
class RoomAssignment
belongs_to :room
has_one :student
end
As students choose rooms, a RoomAssignment gets created for them. I
want a way to pull from the DB all of the rooms belonging to a
particular dorm that don''t have any associated room assignments. Is
there a way to do that without pulling all of the rooms, and doing a
@rooms = @rooms.reject{|r| r.room_assignments.length > 0} ?
Thanks!
--
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
-~----------~----~----~----~------~----~------~--~---
Brian Hogan
2008-Feb-29 18:42 UTC
Re: Finding parent records without has_many :through association
The easiest way is to drop to sql because it''s faster.
class Dorm < ActiveRecord::Base
# your other code
# find all the empty rooms in this dorm
def empty_rooms
sql = "select * from rooms left join room_assignments
on rooms.dorm_id = #{self.id} and rooms.id
room_assignments.room_id
where room_assignments.room_id is null "
rooms = Room.find_by_sql(sql)
end
end
This is modified from a reservation system I wrote so I didn''t test
this but
it should work for you.
On Fri, Feb 29, 2008 at 12:23 PM, Brent Miller <
rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:
>
> Hi all,
>
> Here''s an interesting problem. I''ve got a reasonably
complex set of
> models to represent a college campus housing lottery.
>
> class Dorm
> has_many :rooms
> has_many :room_assignments, :through => :rooms
> end
>
> class Room
> belongs_to :dorm
> has_many :room_assignments
> end
>
> class RoomAssignment
> belongs_to :room
> has_one :student
> end
>
> As students choose rooms, a RoomAssignment gets created for them. I
> want a way to pull from the DB all of the rooms belonging to a
> particular dorm that don''t have any associated room assignments.
Is
> there a way to do that without pulling all of the rooms, and doing a
> @rooms = @rooms.reject{|r| r.room_assignments.length > 0} ?
>
> Thanks!
> --
> 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
-~----------~----~----~----~------~----~------~--~---
Brent Miller
2008-Feb-29 18:52 UTC
Re: Finding parent records without has_many :through associa
Thanks Brian. I''ve been trying to avoid dropping to SQL, because of constraints that I didn''t put in my initial post. The rooms also have another associated model -- RoomAttributes -- that I need to pull from the db at the same time. As far as I know, there''s no way to load associated models when doing find_by_sql. So I guess there are two avenues I''m asking about: 1) How do you load associated models using find_by_sql? or, 2) How do you load a model that doesn''t have associated (has_many :through) objects, without resorting to find_by_sql? Brian Hogan wrote:> The easiest way is to drop to sql because it''s faster. > > class Dorm < ActiveRecord::Base > > # your other code > > > # find all the empty rooms in this dorm > def empty_rooms > sql = "select * from rooms left join room_assignments > on rooms.dorm_id = #{self.id} and rooms.id > > room_assignments.room_id > where room_assignments.room_id is null " > rooms = Room.find_by_sql(sql) > end > > end > > This is modified from a reservation system I wrote so I didn''t test this > but > it should work for you. > > > On Fri, Feb 29, 2008 at 12:23 PM, Brent Miller <-- 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 -~----------~----~----~----~------~----~------~--~---
Brian Hogan
2008-Feb-29 19:26 UTC
Re: Finding parent records without has_many :through associa
Brent:
Don''t fear the SQL. Get your project done. If you need additional
attributes, load them into the query.
I don''t understand what you''re asking about loading models
without
associations. If you don''t define an association between models, you
can''t
use them.
Look at the API. Use the SQL approach.
has_many :subscribers, :class_name => "Person", :finder_sql =>
''SELECT DISTINCT people.* '' +
''FROM people p, post_subscriptions ps '' +
''WHERE ps.post_id = #{id} AND ps.person_id = p.id '' +
''ORDER BY p.first_name''
The way I do it is via SQL. Someone else may be able to help.
On Fri, Feb 29, 2008 at 12:52 PM, Brent Miller <
rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:
>
> Thanks Brian. I''ve been trying to avoid dropping to SQL, because
of
> constraints that I didn''t put in my initial post. The rooms also
have
> another associated model -- RoomAttributes -- that I need to pull from
> the db at the same time. As far as I know, there''s no way to load
> associated models when doing find_by_sql.
>
> So I guess there are two avenues I''m asking about:
>
> 1) How do you load associated models using find_by_sql?
>
> or,
>
> 2) How do you load a model that doesn''t have associated (has_many
> :through) objects, without resorting to find_by_sql?
>
> Brian Hogan wrote:
> > The easiest way is to drop to sql because it''s faster.
> >
> > class Dorm < ActiveRecord::Base
> >
> > # your other code
> >
> >
> > # find all the empty rooms in this dorm
> > def empty_rooms
> > sql = "select * from rooms left join room_assignments
> > on rooms.dorm_id = #{self.id} and
rooms.id
> > > > room_assignments.room_id
> > where room_assignments.room_id is null
"
> > rooms = Room.find_by_sql(sql)
> > end
> >
> > end
> >
> > This is modified from a reservation system I wrote so I
didn''t test this
> > but
> > it should work for you.
> >
> >
> > On Fri, Feb 29, 2008 at 12:23 PM, Brent Miller <
>
> --
> 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
-~----------~----~----~----~------~----~------~--~---
Brent Miller
2008-Feb-29 19:36 UTC
Re: Finding parent records without has_many :through associa
It''s not about fearing the SQL. :+)
What I would really like to do is something like this:
Dorm.find(:all, :include => {:rooms => [:room_assignments,
:room_attributes]}, :conditions => ''there is no
room_assignment'')
Because this is for a housing lottery, where students choose available
rooms, I need to pull rooms that have no records in the defined
association.
If I simply do a find_by_sql, there''s no way to have the associated
models (:rooms and :room_assignments) load in the same query. I don''t
think I can afford the performance hit of doing this in multiple
queries. Does this make more sense?
--
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
-~----------~----~----~----~------~----~------~--~---
Brian Hogan
2008-Feb-29 20:10 UTC
Re: Finding parent records without has_many :through associa
Brent:
Did you look at the api like I recommended? Cos it just occurred to me that
this would probably work...
Dorm.find(:all, :include => {:rooms => [:room_assignments,
:room_attributes]}, :conditions => ''room_assignments.room_id is
null'')
But I hope you don''t have a lot of dorms. Loading a lot of objects into
memory can be a bit time consuming. That''s why I use the sql route -
for
speed.
p.s. : I''ve done room lottery before. I''m quite familiar with
the concept.
:)
On Fri, Feb 29, 2008 at 1:36 PM, Brent Miller <
rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:
>
> It''s not about fearing the SQL. :+)
>
> What I would really like to do is something like this:
>
> Dorm.find(:all, :include => {:rooms => [:room_assignments,
> :room_attributes]}, :conditions => ''there is no
room_assignment'')
>
> Because this is for a housing lottery, where students choose available
> rooms, I need to pull rooms that have no records in the defined
> association.
>
> If I simply do a find_by_sql, there''s no way to have the
associated
> models (:rooms and :room_assignments) load in the same query. I
don''t
> think I can afford the performance hit of doing this in multiple
> queries. Does this make more sense?
> --
> 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
-~----------~----~----~----~------~----~------~--~---
Brent Miller
2008-Feb-29 22:09 UTC
Re: Finding parent records without has_many :through associa
Yeah -- that doesn''t work. It''s because the story is, yet again, more complicated than I made it seem. There are tons of RoomAssignments in the database -- the DB is a legacy database over which I don''t have a lot of control, since it''s used by other applications & systems. The table that holds the room assignments has all of the historical data. So, I always need a condition that pulls out the current term. So my conditions would look like this: :conditions => "room_assignments.room_id is null AND room_assignments.term = ''200801''" The 200801 refers to the fall of the 2007-08 academic year. That condition will NEVER be fulfilled. :( So this brings me back to the 2 ways for solving the problem: 1) Loading the associated models when using find_by_sql, or with a :finder_sql statement on the association 2) Loading a model that doesn''t have associated (has_many :through) objects that fit an arbitrary criterion, without resorting to find_by_sql? I''ve been stewing at this for several days, and nothing I''ve tried has been working. Brian, I totally appreciate the help. :) -- 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 -~----------~----~----~----~------~----~------~--~---
Ilan Berci
2008-Feb-29 22:37 UTC
Re: Finding parent records without has_many :through associa
Brent Miller wrote:> > 1) Loading the associated models when using find_by_sql, or with a > :finder_sql statement on the association > 2) Loading a model that doesn''t have associated (has_many :through) > objects that fit an arbitrary criterion, without resorting to > find_by_sql? > > I''ve been stewing at this for several days, and nothing I''ve tried has > been working. Brian, I totally appreciate the help. :)Brent, Does this legacy database support views, If so, you can create a view that strips out the legacy data and forms it to be a first class citizen for ActiveRecord::Base. I have used views before to be consumed by rails, the only thing you really have to watch out for is that migrations will misread your views as tables so you have to find a way to work around it. Views have the advantage of cleaning up your server code as well so when you do get a chance to migrate your db to the new form, it will be a much smoother transition.. hth ilan -- 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 -~----------~----~----~----~------~----~------~--~---
Brent Miller
2008-Feb-29 22:52 UTC
Re: Finding parent records without has_many :through associa
The legacy DB is Oracle, so it *definitely* supports views. Today while exchanging messages on this thread I''ve been playing with views, to make the table nicer to use with Rails and abstract out the useless data. I''ve pretty much come to the conclusion that it''s the easiest way to go, although I''m still curious about the 2 main questions we came up with above. I''m sure we''ll run into these kinds of situations again. We will never be able to migrate our DB to the new form, since it''s very large, very complex, and very much out of our hands -- it''s an off-the-shelf product that our organization is pretty much wedded to. In general, though, our best practice is not to use the views to correct the naming scheme: that would require us to go back and re-examine every app we write against this DB whenever there''s a DB upgrade, in order to fix the views. The upgrades are more frequent than we''d like, and always cause some kind of havoc; our policy is to try and minimize that. In general I''ve found that rails does pretty well in this situation, except when complex queries like this one are needed. -- 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 -~----------~----~----~----~------~----~------~--~---