Not quite, unfortunately. The point here (that is making things complex), is that
round.round_combination has no semantic. Rather, the semantic is more like [round_1, round_2].round_combination That is, an (unordered) set of two rounds determines the round_combination. On the flip side, a Competitor has one Room. As motivation, what's going on here is that Competitors are competing in a two-round math competition. They each sign up for two rounds ahead of time, and we put them in a room determined by which two rounds they signed up for. (Hence, a Competitor also has one RoundCombination; it's just not clear to me how the join query should work... I'm starting to think maybe I should just write that by hand.) In any case, the code I provided has the right functionality, but it's bad in the sense that it loads all of the RoundCombinations as AR objects each time its called, which is a lot of overhead... Greg On Feb 15, 9:29 pm, Harold A. Giménez Ch. <harold.gime...@gmail.com> wrote: > From what I understand, one competitor will have as many rooms as > RoundCombinations. Your room definition below would return the first one it > finds. > > I think you can do something like: > > @competitor.rounds.each { |round| round.round_combination.room } > > Would return an array of rooms for each of @competitor's rounds. > > That sound right? > > On Sun, Feb 15, 2009 at 7:48 PM, Greg <gregory.brock...@gmail.com> wrote: > > > Ah, sorry, my specification was not very good. The Big Picture here > > is that we assign each Competitor to a room based on the particular > > combination of Rounds he or she is signed up for. So for example, we > > could have > > > r = RoundCombination.new > > r.room = room_1 > > r.rounds = [round_1, round_2] > > r.save > > > Now if c is a Competitor who is signed up for round_1 and round_2, I > > would like to be able to do > > > c.room > > #=> room_1 > > > So essentially, a HABTM table does not seem to be the right way of > > capturing this relationship. A Competitor "knows" its > > RoundCombination because the Competitor is signed up for a particular > > combination of Rounds. I've managed a provisional, rather inefficient > > implementation, of c.room as > > > class Competitor < ActiveRecord::Base > > has_many :rounds > > > def room > > RoundCombination.all.each do |rc| > > return rc.room if rc.rounds.sort_by {|r| r.id} == rounds.sort_by > > {|r| r.id} > > end > > nil > > end > > end > > > I feel this should be done with some SQL joins or something. Does > > Rails provide a relationship to manage this? > > > Thanks again, > > > Greg > > > On Feb 15, 6:06 pm, "Harold A. Gimenez" <harold.gime...@gmail.com> > > wrote: > > > Actually, by user I mean competitor, but you get the point... > > > > -----Original Message----- > > > From: Harold <harold.gime...@gmail.com> > > > Reply-to: rubyonrails-talk@googlegroups.com > > > To: Ruby on Rails: Talk <rubyonrails-talk@googlegroups.com> > > > Subject: [Rails] Re: Two-to-one mappings > > > Date: Sun, 15 Feb 2009 14:55:27 -0800 (PST) > > > > Does a user have many round_combinations? and a round_combination has > > > many users? Seems like it. If so, first thought is to create another > > > HABTM table between round_combinations and users. Then > > > @user.round_combinations.each { |rc| rc.room } gives you the rooms... > > > > On Feb 15, 11:16 am, Greg <gregory.brock...@gmail.com> wrote: > > > > Ah, so one follow up question: each Competitor in the competition is > > > > signed up for two rounds, and needs to know which room he or she is > > > > assigned. This is a has_one relationship; however, I'm not quite sure > > > > of the right way to map it. Thoughts? > > > > > Greg > > > > > On Feb 15, 2:49 am, Harold A. Giménez Ch. <harold.gime...@gmail.com> > > > > wrote: > > > > > > Great! Glad it worked. > > > > > > On Sun, Feb 15, 2009 at 1:57 AM, Greg <gregory.brock...@gmail.com> > > wrote: > > > > > > > Cool! Harold, your solution strikes me as being exactly the way to > > do > > > > > > it. I've implemented it, and things seem to be sailing smoothly. > > > > > > Thanks a lot to both of you. > > > > > > > Sincerely, > > > > > > > Greg > > > > > > > On Feb 14, 11:47 pm, Harold <harold.gime...@gmail.com> wrote: > > > > > > > That's a clean solution, however I don't know if it satisfies the > > fact > > > > > > > that "any Room might have many different combinations of Rounds" > > > > > > > > Not sure I understand correctly, but if a room can have many > > > > > > > combination of rounds, and each combination of rounds has more > > than > > > > > > > one round, you could try this: > > > > > > > > Room and Round models I assume you already have. A room can have > > many > > > > > > > round_combinations (create the RoundCombination model with a > > room_id. > > > > > > > Room :has_many :room_combinations, and > > > > > > > RoomCombination :belongs_to :room). Then create a join table > > between > > > > > > > round_combinations and rounds (HABTM). > > > > > > > > You can use callbacks or validation to limit the relationship to > > two > > > > > > > rounds maximum. > > > > > > > > On Feb 14, 11:42 pm, Maurício Linhares < > > mauricio.linha...@gmail.com> > > > > > > > wrote: > > > > > > > > > Imagining that every round must belong to a room, here's a > > simple and > > > > > > > > straightforward implementation: > > > > > > > > > class Room < ActiveRecord::Base > > > > > > > > # this class needs a max_rounds and rounds_count integer > > columns > > > > > > > > has_many :rounds > > > > > > > > > def accepts_more_rounds? > > > > > > > > max_rounds < rounds_count > > > > > > > > end > > > > > > > > > end > > > > > > > > > class Round < ActiveRecord::Base > > > > > > > > # this class needs a room_id integer column > > > > > > > > belongs_to :room, :counter_cache => true > > > > > > > > > validate_on_create :validate_rounds_count > > > > > > > > > protected > > > > > > > > > def validate_rounds_count > > > > > > > > self.room.reload > > > > > > > > unless self.room.accepts_more_rounds? > > > > > > > > errors.add( :room, "has already met it's rounds limit" ) > > > > > > > > end > > > > > > > > end > > > > > > > > > end > > > > > > > > > room = Room.create( :max_rounds => 2 ) > > > > > > > > round_1 = room.rounds.create( :name => 'round 1' ) > > > > > > > > round_2 = room.rounds.create( :name => 'round 2' ) > > > > > > > > round_3 = room.rounds.create( :name => 'round 3' ) # this one > > isn't > > > > > > > > going to be created > > > > > > > > round_3.new_record? == true > > > > > > > > > - > > > > > > > > Maurício > > > > > > > > Linhareshttp://alinhavado.wordpress.com/(pt-br)<http://alinhavado.wordpress.com/%28pt-br%29> > > <http://alinhavado.wordpress.com/%28pt-br%29>| > > > > > >http://blog.codevader.com/(en) <http://blog.codevader.com/%28en%29>< > >http://blog.codevader.com/%28en%29> > > > > > > > > > On Sat, Feb 14, 2009 at 7:53 PM, Greg Brockman > > > > > > > > > <gregory.brock...@gmail.com> wrote: > > > > > > > > > > Hey all, > > > > > > > > > > I have a pretty simple question, but I'm not sure of a good > > solution > > > > > > > > > to it. Essentially, I want to provide a two-to-one mapping > > of > > > > > > models. > > > > > > > > > I'm working on an application for a contest, where every > > (unordered) > > > > > > > > > combination of two Rounds is supposed to be assigned to one > > Room. > > > > > > Any > > > > > > > > > Room might have many different combinations of Rounds, > > however. > > > > > > > > > > What is the Right Way of doing this in Rails? Maybe create a > > model > > > > > > > > > that holds the associated foreign keys? Also, what would be > > a good > > > > > > > > > way to scale this out, if I wanted to be able to map > > unordered > > > > > > > > > n-element collections of Rounds to obtain a Room? > > > > > > > > > > Thanks, > > > > > > > > > > Greg --~--~---------~--~----~------------~-------~--~----~ 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@googlegroups.com To unsubscribe from this group, send email to rubyonrails-talk+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---