Pat- So, just so I am clear, you should only define indexes on has_many associations, not has_many_through associations. Is that correct? Or am I just doing a has_many_through the wrong way with TS?
Greg On Feb 25, 11:37 pm, Pat Allan <[email protected]> wrote: > Actually, now that I'm knee-deep in code, I don't think this is cleanly > possible... > > In this situation, we're searching on Lessons. Within the Rails context, we > know that the association we're searching within is :lessons, and that's via > :buckets_lessons. However, the attribute is buckets(:id), so we want a > reference to Bucket from Lesson - and Rails doesn't have the concept of > reverse associations. > > So, the only way I can see is to look at all associations in Lesson that > point to a Bucket. But then, what happens if there's more than one? Or what > if there's only one, but not the one we want? Beyond some seriously complex > comparisons (and I don't really want to deal with figuring out whether one > association is the reverse of another), I think we're out of luck on this > approach. > > Of course, this doesn't answer the fact that it worked in 1.2.9 - and I'm > still at a loss at how it ever did that. > > So, I think the best solution is to use the other attribute definition: > has bucket_lessons.bucket_id, :as => :bucket_ids > > Sorry for dragging this out and ending up at a dead end, Greg. > > -- > Pat > > On 26/02/2010, at 3:03 PM, Pat Allan wrote: > > > > > Hi Greg > > > Yes, that was taken out on purpose, because of someone having issues with a > > hm:through that was trying to match a singular reference to a plural > > reference in the stack (something like :item and :items). > > > However, I've just set up your three models here on my machine, and when I > > get to that loop to find the matching attribute, the stack is > > [:bucket_lessons], and the foreign key is bucket_id (and this is in the > > 1.2.9 gem) - hence why I'm confused how it worked for you then. > > > That said, I'll try to get it working with your kind of setup as well. > > (Should be easier now I have identical models) > > > Cheers > > > -- > > Pat > > > On 25/02/2010, at 2:33 AM, Greg DeVore wrote: > > >> Pat- > >> It is because it is a has_many :through => association. So there is a > >> buckets table, a buckets table and a bucket_lessons table. So, in 1.2, > >> when I indexed Lessons with an index of: > > >> has buckets(:id), :as => :bucket_ids > > >> TS would see that has_many_through association with buckets and set > >> things up accordingly. 1.3 does this as well, thus the configuration > >> file is generated without a problem. > > >> But you TS tries to build the attribute name like so: > > >> ============== > >> def attribute_for_foreign_key > >> (@reflection.klass.sphinx_indexes || []).each do |index| > >> attribute = index.attributes.detect { |attrib| > >> attrib.columns.length == 1 && > >> attrib.columns.first.__name == foreign_key.to_sym > >> } > > >> ============ > > >> It is only keying off of the column name. In 1.2, look at the same > >> code: > > >> ============ > >> def attribute_for_foreign_key > >> (@reflection.klass.sphinx_indexes || []).each do |index| > >> attribute = index.attributes.detect { |attrib| > >> attrib.columns.length == 1 && > >> attrib.columns.first.__name == foreign_key.to_sym && > >> attrib.columns.first.__stack == stack > >> } > > >> ========== > > >> It includes the stack, not just the column name, which helps TS > >> uniquely identify the table. > > >> So my real question is, was this taken out on purpose? If so, it would > >> break any has_many_through associations for everyone it would seem. > > >> Thanks for looking at this. > > >> Greg > > >> On Feb 24, 4:42 am, Pat Allan <[email protected]> wrote: > >>> Actually, now that I've investigated a bit further, I'm not sure how this > >>> ever worked out for you. If you're searching from @bucket.lessons, I > >>> would expect TS to try and match :bucket_lessons for the stack, and yet > >>> that's not referred to in the attribute you've defined. > > >>> Maybe it's because it's late and my brain's unhappy that I'm yet to have > >>> dinner... > > >>> Are you able to send me a copy of your app so I can try it locally? And > >>> why is bucket_lessons.bucket_id (for the attribute) not an ideal option? > > >>> Cheers > > >>> -- > >>> Pat > > >>> On 24/02/2010, at 8:06 PM, Pat Allan wrote: > > >>>> Hi Greg > > >>>> Sorry for not getting back to you sooner on this - it's definitely a > >>>> bug. There have been some changes with the associations search code, but > >>>> this was just to make it a little less fussy about determining the > >>>> association's attribute. It shouldn't have broken other situations, but > >>>> obviously I made a mistake, and it has. > > >>>> I'll try to reproduce the issue locally and then fix it. > > >>>> Cheers > > >>>> -- > >>>> Pat > > >>>> On 20/02/2010, at 8:56 AM, Greg DeVore wrote: > > >>>>> I saw some other messages on this but I think this problem is slightly > >>>>> different. Some background - have been using the TS plugin (version > >>>>> 1.2.9) and am now upgrading to 1.3.16. I am running rails 2.3.5 on Mac > >>>>> OS 10.5. > > >>>>> Models > >>>>> ====== > > >>>>> class Lesson < ActiveRecord::Base > >>>>> has_many :bucket_lessons > >>>>> has_many :buckets, :through => :bucket_lessons > >>>>> end > > >>>>> class BucketLesson < ActiveRecord::Base > >>>>> belongs_to :bucket > >>>>> belongs_to :lesson > >>>>> end > > >>>>> class Bucket < ActiveRecord::Base > >>>>> has_many :bucket_lessons > >>>>> has_many :lessons, :through => :bucket_lessons > >>>>> end > > >>>>> Lesson Index > >>>>> ========== > > >>>>> has buckets(:id), :as => :bucket_ids > > >>>>> The search call is: > > >>>>> @bucket.lessons.search "string" > > >>>>> This worked fine with version 1.2.9, but in 1.3.16 it throws the error > >>>>> "Missing Attribute for Foreign Key bucket_id" > > >>>>> I added some logging into has_many_association.rb file in the > >>>>> 'attribute_for_foreign_key' method: > > >>>>> Here is what is being logged: > >>>>> "COLUMNS are #{attrib.columns.inspect} AND > >>>>> #{attrib.columns.first.__name}" > > >>>>> The results are: > >>>>> [#<ThinkingSphinx::Index::FauxColumn:0x7452228 @name=:id, > >>>>> @stack=[:buckets]>] AND id > > >>>>> In version 1.2.9 TS would combine the stag and name to check the > >>>>> foreign key. But in 1.3.16 it is just checking the name which is > >>>>> incorrect. Therefore it never finds the bucket_id foreign key. > > >>>>> By changing the index I can get it to work. > > >>>>> has bucket_lessons(:bucket_ids), :as => :bucket_ids > > >>>>> But that it not ideal. > > >>>>> Was this a deliberate change in the upgrade to 1.3 or is this a bug? > > >>>>> Greg DeVore > >>>>> Blue Mango Learning Systems > > >>>>> -- > >>>>> You received this message because you are subscribed to the Google > >>>>> Groups "Thinking Sphinx" group. > >>>>> To post to this group, send email to [email protected]. > >>>>> To unsubscribe from this group, send email to > >>>>> [email protected]. > >>>>> For more options, visit this group > >>>>> athttp://groups.google.com/group/thinking-sphinx?hl=en. > > >>>> -- > >>>> You received this message because you are subscribed to the Google > >>>> Groups "Thinking Sphinx" group. > >>>> To post to this group, send email to [email protected]. > >>>> To unsubscribe from this group, send email to > >>>> [email protected]. > >>>> For more options, visit this group > >>>> athttp://groups.google.com/group/thinking-sphinx?hl=en. > > >> -- > >> You received this message because you are subscribed to the Google Groups > >> "Thinking Sphinx" group. > >> To post to this group, send email to [email protected]. > >> To unsubscribe from this group, send email to > >> [email protected]. > >> For more options, visit this group > >> athttp://groups.google.com/group/thinking-sphinx?hl=en. > > > -- > > You received this message because you are subscribed to the Google Groups > > "Thinking Sphinx" group. > > To post to this group, send email to [email protected]. > > To unsubscribe from this group, send email to > > [email protected]. > > For more options, visit this group > > athttp://groups.google.com/group/thinking-sphinx?hl=en. -- You received this message because you are subscribed to the Google Groups "Thinking Sphinx" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/thinking-sphinx?hl=en.
