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 at 
> http://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.

Reply via email to