Hi Pat! Thanks a lot for your help! It works just fine now! i guess the mistake i did was the one you noticed: 0 instead of '0'!
I really appreciate it :-) Gedeon On Apr 12, 5:53 pm, Pat Allan <[email protected]> wrote: > You can use arrays for any integer filter - it will return documents that > have any of the values of the array in that attribute (NOT necessarily *all* > of the values - use :with_all for that behaviour). > > Also, you probably want to return the public members_or_public value as a > string, not an integer - '0' instead of 0. Not sure if that's the cause of > the problem, though. > > And have you restarted Sphinx as well as re-indexing? rake ts:rebuild does > this all in one shot. > > Cheers > > -- > Pat > > On 12/04/2010, at 8:43 PM, Gedeon wrote: > > > Hi again, > > > I just tried this, following Pat's recommendations ,but i can't get it > > to work... Can you let me know what I'm doing wrong? > > > I have: > > > has members(:id), :as => :member_ids, :type => :multi > > has "IF(private = 0, 0, GROUP_CONCAT(memberships.id))", :as > > => :members_or_public, :type => :multi > > > Which should return 0 if the project is public or a list of member_ids > > if it is private. > > > Then, in my search: > > > res = ThinkingSphinx.search options[:q], :classes => > > [Project], :page => 1, :per_page => 10, > > :with => { :members_or_public => [0, @user.id] } > > > This does not get me any result. However, If I remove the "With" > > condition, I can get search results. > > I cannot see any example of ... > > :with => { :multi_value_attribute => [ array_of_values] } > > ... in the documentation, so i'm not sure how to do it.. > > > Thanks again for your time and help! > > > Gedeon > > > On Apr 12, 9:55 am, Gedeon <[email protected]> wrote: > >> Hi! > >> Thanks a lot Pat and Adam, I'm going to study that a bit and see how I > >> can use it properly in my case. > > >> On Apr 11, 10:58 pm, adamcooper <[email protected]> wrote: > > >>> Just wanted to chime in that we do this approach in almost all our > >>> models and you can do very complex authorizations. > > >>> We use a custom sql query for the MVA rather than forcing the join in > >>> the main index. I guess it depends on how complex it is to get your > >>> authorization_ids. In our case we have to join three separate tables > >>> to get the ids we are looking for. I think pulling it out into a > >>> separate query is a little bit easier on the database. > > >>> Here is a sample complex case for you example: (Even expanding if you > >>> had admins/moderators/members) > > >>> has WRITE_ID_SQL, :as => :write_ids, :type => :multi > >>> has READ_ID_SQL, :as => :read_ids, :type => :multi > > >>> WRITE_ID_SQL = <<-END select project.id * 3 + 2 as id, > >>> IF((memberships.level = #{Privacy::MODERATOR} OR memberships.level = > >>> #{Privacy::ADMIN}, IFNULL(memberships.member_id, 0), 0) as write_ids > >>> fromprojects > >>> inner join memberships onprojects.id = memberships.project_id > >>> END > > >>> READ_ID_SQL = <<-END select project.id * 3 + 2 as id, > >>> memberships.member_id as read_ids > >>> fromprojects > >>> inner join memberships onprojects.id = memberships.project_id > >>> END > > >>> Then when you do your search all you have to do is pass in the user_id > >>> of the current_user into the read_ids and write_ids depending on which > >>> type of permission you checking for. > > >>> Cheers, > >>> Adam > > >>> On Apr 8, 9:39 pm, Pat Allan <[email protected]> wrote: > > >>>> You will need to force the join to the members table using another > >>>> (normal) attribute or field, if you're not doing that already... > > >>>> has members(:id), :as => :normal_member_ids > > >>>> In your SQL snippet, you'll want to merge all ids together into a > >>>> string, separated by commas. GROUP_CONCAT or CONCAT_WS will be helpful > >>>> for that. > > >>>> Cheers > > >>>> -- > >>>> Pat > > >>>> On 09/04/2010, at 1:30 PM, Gedeon wrote: > > >>>>> Hmm one more thing. This might be silly and mysql related more than > >>>>> TS, but how can I retrieve member_ids from an IF snippet? > >>>>> I can't see anything like that in the MYSQL api. > > >>>>> I'd need "IF(private = 0, 0, *some way of retrieving member ids from > >>>>> the memberships table*)" > > >>>>> If you have any idea, please let me know. In the mean time, i'm > >>>>> searching and will post any solution I find. > > >>>>> Thanks a lot! > > >>>>> Gedeon > > >>>>> On Apr 9, 8:35 am, Pat Allan <[email protected]> wrote: > >>>>>> Hi Gedeon > > >>>>>> I think the best way forward is to create another custom SQL snippet - > >>>>>> if the project is public, return 0, otherwise, return the member > >>>>>> ids... and then you can filter on :member_ids => [0, @user.id] for > >>>>>> moderators, and :member_ids => @user.id for normal users. I think this > >>>>>> will work, but haven't thought about it too much. > > >>>>>> Keep in mind you'll want to set the attribute's type as :multi. > > >>>>>> Hope this helps > > >>>>>> -- > >>>>>> Pat > > >>>>>> On 08/04/2010, at 3:00 PM, Gedeon wrote: > > >>>>>>> Hello! > > >>>>>>> I'm adding a search feature in a project and just started using Sphinx > >>>>>>> and Thinking Sphinx about a week ago. I'm seeking some help from > >>>>>>> Sphinx Gurus here, can any of you help me? I would be extremely > >>>>>>> grateful, as I've been stuck on this for a couple of days already. > > >>>>>>> I basically have 3 models involved in this: > > >>>>>>> Project: > >>>>>>> has_many :members, :through => :memberships, :source => :user > > >>>>>>> Membership, which links users toprojects > > >>>>>>> User: > >>>>>>> has_many :projects, :through => :memberships > > >>>>>>> Users should be able to search forprojects. However, depending on > >>>>>>> their access level, they can see more or lessprojects: > > >>>>>>> - Admin users can see allprojects(public and private). So I got > >>>>>>> something like this: > >>>>>>> Project.search options[:q], :page => 1, :per_page => 10 > >>>>>>> Simple and easy, I can handle that. > > >>>>>>> - Normal users can only seeprojectsthey are member of. How can I do > >>>>>>> this? > >>>>>>> I guess (but i could be completely wrong) I need this in my Project > >>>>>>> index: > >>>>>>> has members(:id), :as => :member_ids > >>>>>>> But how can I use it? Or what should I use? > >>>>>>> Project.search options[:q], :page => 1, :per_page => 10, > >>>>>>> :with => { } # member_ids.include?(@user.id) > > >>>>>>> - I kept the best for the end : Moderators can view all public > >>>>>>>projectsand allprojectsthey are a member of.It's basically the same > >>>>>>> as a normal user, with some "OR" condition cream on top of it: > >>>>>>> Project.search options[:q], :page => 1, :per_page => 10, > >>>>>>> :with => { :private => 0 } # OR member_ids.include? > >>>>>>> (@user.id) > > >>>>>>> I'm already using the "OR" trick to search within my contacts but I > >>>>>>> cant apply it here as it only works when the permission is within the > >>>>>>> same model: > >>>>>>> has "IF(view_permission = 0, 0, contact_owner)", :as => :owner, :type > >>>>>>> => :integer > > >>>>>>> Any idea how to deal with moderators and normal users searches? > >>>>>>> Thanks a lot to everyone for at least reading this. Extra thanks for > >>>>>>> those who can help! > > >>>>>>> PS: In the worst case scenario, is there a way of "unpaginating" the > >>>>>>> results i get from TS, removingprojectsthat don't match the > >>>>>>> conditions, then re-paginating? I know that's a terrible solution and > >>>>>>> I want to avoid it at all costs. However, we'll never have more than > >>>>>>> 100projectsin the database and I'd rather have a that than no search > >>>>>>> at all. > > >>>>>>> -- > >>>>>>> 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.
