I cant seem to use :through to get the grandchildren objects when the intermedetiate uses a has_one relationship with the grandchild model. E.g. class User < ActiveRecord::Base has_many :sentences has_many :corrections, :through => :sentences end class Sentence < ActiveRecord::Base belongs_to :user has_one :correction end class Correction < ActiveRecord::Base belongs_to :sentence end I want to do User.corrections but unfortunately that doesnt work. I get ActiveRecord::HasManyThroughSourceAssociationMacroError: Invalid source reflection macro :has_one for has_many :corrections, :through => :sentences. Use :source to specify the source reflection. but if i remove the has_one and replace it with has_many like so class Sentence < ActiveRecord::Base belongs_to :user has_many :corrections #previously has_one end then It works. The problem is I dont want to specify has_many because there will only be one correction for a sentence. How do i achieve what I want, namely to be able to access all the corrections for a given user -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On 13 June 2010 15:25, Adam Akhtar <lists-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> How do i achieve what I want, namely to be able to access all the > corrections for a given userCreate a method on User called "corrections" and collect up the user''s sentences'' corrections. class User < ActiveRecord::Base has_many :sentences def corrections sentences.inject([]) { |memo, sentence| memo << sentence.corrections }.flatten.compact end end http://ruby-doc.org/core/classes/Enumerable.html#M003140 -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@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.
Adam Akhtar wrote:> > class Sentence < ActiveRecord::Base > belongs_to :user > has_many :corrections #previously has_one > end > > then It works. The problem is I dont want to specify has_many because > there will only be one correction for a sentence. >So could you not use the has_many abilities of the framework (and achieve one of your goals) and enforce in your model your idea of a single correction per sentence (achieving your other goal)? It might be the simplest solution. -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Ar Chron wrote:> Adam Akhtar wrote: >> >> class Sentence < ActiveRecord::Base >> belongs_to :user >> has_many :corrections #previously has_one >> end >> >> then It works. The problem is I dont want to specify has_many because >> there will only be one correction for a sentence. >> > > So could you not use the has_many abilities of the framework (and > achieve one of your goals) and enforce in your model your idea of a > single correction per sentence (achieving your other goal)? > > It might be the simplest solution.That''s a pretty bad idea. has_one is a little smelly, but it''s there, and it should work with :through. Better to solve the problem than to kludge around the framework. Best, -- Marnen Laibow-Koser http://www.marnen.org marnen-sbuyVjPbboAdnm+yROfE0A@public.gmane.org -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@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 guys for the replies. I considered Ars suggestion but for the same reason as Marnen posted it doesnt sit right. But the problem is I created a new test project just to test the above syntax out and its failing. We all make mistakes and blame the framework but this time i honestly cant figure out the source of this problem. Im starting to think that this is simply not possible in rails when you have a has_one in the middle. Can anyone confirm if this is a limitation of the framework? -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
> > Can anyone confirm if this is a limitation of the framework?anyone???? -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On 15 June 2010 13:46, Adam Akhtar <lists-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> >> >> Can anyone confirm if this is a limitation of the framework? > > anyone????You said in your first post that it *didn''t* work trying to do a :though on a :has_one. So as far as I can see you have three choices: 1) Fudge it with a :has_many that you manually check only has one associated - messy, as Marnen pointed out. 2) Add the method I suggested to do the collect yourself (I default to using .inject, which is quite verbose... you could do the same thing with .map, which would remove the references to ''memo''). If the functionality *was* in Rails, it would be doing something similar in the background... 3) Patch Rails yourself to support going through a :has_one - look at the source of :has_many and see what it''s missing. Personally, I''d do what I suggested (well, I would wouldn''t I! ;-) as you can''t expect the framework to do *everything* for you, and helpers like :through only come about when loads of people need to do the same thing frequently. -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Adam Akhtar wrote:> >> >> Can anyone confirm if this is a limitation of the framework? > > anyone????How do you expect an answer to that if you haven''t told us what versions of Ruby and Rails you''re using? Best, -- Marnen Laibow-Koser http://www.marnen.org marnen-sbuyVjPbboAdnm+yROfE0A@public.gmane.org -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On 15 June 2010 14:12, Marnen Laibow-Koser <lists-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> Adam Akhtar wrote: >> >>> >>> Can anyone confirm if this is a limitation of the framework? >> >> anyone???? > > How do you expect an answer to that if you haven''t told us what versions > of Ruby and Rails you''re using? >I can confirm I get the same error trying to do a :has_many :through on a :has_one "grandchild" in Rails 2.3.5 and Ruby 1.8.7 Like I said, I don''t think it''s a "problem" - it''s just not something that anyone''s wanted enough (or at all) to be implemented. With the amount of time you''ve probably spent stressing about it, you could have written your own collection method a dozen times or more! -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On Jun 15, 2:19 pm, Michael Pavling <pavl...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On 15 June 2010 14:12, Marnen Laibow-Koser <li...-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote: > > > Adam Akhtar wrote: > > >>> Can anyone confirm if this is a limitation of the framework? > > >> anyone???? > > > How do you expect an answer to that if you haven''t told us what versions > > of Ruby and Rails you''re using? > > I can confirm I get the same error trying to do a :has_many :through > on a :has_one "grandchild" in Rails 2.3.5 and Ruby 1.8.7 >Although this commit http://github.com/rails/rails/commit/b763858ed5faeda720035dd2178e7c44aa34240a (which would have made it into rails 2.3) claims otherwise Fred> Like I said, I don''t think it''s a "problem" - it''s just not something > that anyone''s wanted enough (or at all) to be implemented. With the > amount of time you''ve probably spent stressing about it, you could > have written your own collection method a dozen times or more!-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@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.
On 15 June 2010 14:23, Frederick Cheung <frederick.cheung-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:>> I can confirm I get the same error trying to do a :has_many :through >> on a :has_one "grandchild" in Rails 2.3.5 and Ruby 1.8.7 > > Although this commit http://github.com/rails/rails/commit/b763858ed5faeda720035dd2178e7c44aa34240a > (which would have made it into rails 2.3) claims otherwiseHrmm.... I think curiosity will get me to check I wasn''t running an old version... could''ve sworn the project I checked it on was 2.3.5... :-/ -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Marnen Laibow-Koser wrote:> Ar Chron wrote:>> It might be the simplest solution. > > That''s a pretty bad idea. has_one is a little smelly, but it''s there, > and it should work with :through. Better to solve the problem than to > kludge around the framework. >True, but I guess it depends on which ''smell'' you find least disagreeable... hence the ''might be''. If I had to have to working today, I''d work around the issue, and queue up the issue for analysis. If I had time to research, I''d dive into the framework code. But that choice is very situational. -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
ahh sorry my bad. Im using rails 2.3.2 and ruby v1.87 -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.