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.