I was able to do the equivalent of searching one person's contacts.
To Person, add:
has_many :contact_owner_relationships, :class_name =>
"Relationship", :foreign_key => "person_id", :conditions =>
["relationships.kind = ?", Relationship::CONTACT]
define_index do
has contact_owner_relationships.user_id, :as => :contact_owners
end
Now, I can search within a user's contacts:
Person.search :with => { :contact_owners => User.first.id }
Two problems I still have, however.
1. Would rather search like User.first.contacts.search.
2. With a many-to-many relationship where there are additional
attributes on the association model, how do I filter by those
attributes. For example, in my example the Relationship model has a
created_at attribute. It would be great to sort on when the
relationship was created, but I can't get it to work. Is this
possible?
On Aug 21, 8:30 pm, gobigdave <[email protected]> wrote:
> In far more simple terms, is there a way I can do:
>
> User.first.contacts.search('dave')
>
> That would be ideal, but I haven't been able to find the right indexes/
> has combinations.
>
> On Aug 21, 5:17 pm, gobigdave <[email protected]> wrote:
>
>
>
> > I have classes like:
>
> > class Person < ActiveRecord::Base
> > has_many :relationships, :class_name => "Relationship", :foreign_key
> > => "user_id", :dependent => :delete_all
> > has_many :owner_relationships, :class_name =>
> > "Relationship", :foreign_key => "person_id", :dependent => :delete_all
> > has_many :owners, :through => :owner_relationships, :source => :user
> > end
>
> > class Contact < Person
> > end
>
> > class User < Person
> > has_many :people, :through => :relationships, :source => :person
> > has_many :contacts, :through => :relationships, :source
> > => :person, :conditions => ["relationships.kind = ?",
> > Relationship::CONTACT]
> > has_many :colleagues, :through => :relationships, :source
> > => :person, :conditions => ["relationships.kind = ?",
> > Relationship::COLLEAGUE]
>
> > define_index do
> > has owners(:id), :as => :owners
> > has owner_relationships.kind, :as => :owners_kind
> > end
> > end
>
> > class Relationship < ActiveRecord::Base
> > belongs_to :user, :class_name => "Person", :foreign_key =>
> > "user_id"
> > belongs_to :person, :class_name => "Person", :foreign_key =>
> > "person_id"
> > end
>
> > Essentially, users have contacts and colleagues. Colleagues can only
> > be other users, but Contacts can be any Person. My problem is that I
> > can't get data to match up. For example:
>
> > user = User.first
> > user.contacts.count # => 128
>
> > but
>
> > user = User.first
> > people = Person.search(:with => { :owners => user.id, :owners_kind =>
> > Relationship::CONTACT })
> > people.total_entries # => 140
>
> > The search returns people that have COLLEAGUE relationships, and I
> > can't make it stop. Any idea how I can limit my search to a user's
> > contacts or colleagues? I tried adding another has_many contact_owners
> > to Person, and then adding a separate index, but that didn't work
> > either. Looking at the SQL in the sphinx.conf file, it looks like two
> > joins are made to the relationships table - once with a kind condition
> > and one without. Am I doing something wrong, or is there a bug here?
>
> > It would be great to be able to do user.contacts.search and have it
> > work. I tried it but TS complains about a missing user_id foreign key.
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---