Hi, Ok, didn't read enough of the manual... It was due to not using CRC32. Seems to be working now except for passing an empty array to the :with but I can work around that by using a random string that will never be a real find.
One final question, when using ThinkingSphinx.search and :with can I conditions the :with parameter only to apply to the Projects table? I have a couple of other tables that are searchable and they do not have the search_access_tag field and they don't seem to showing up anymore. Warm regards, Robert On Jun 29, 5:11 pm, rbjarnason <[email protected]> wrote: > Hi Pat, > > I've now implemented a solution, not sure if this is the best way but > it seems to work pretty well. > > I added a new field to the projects table called search_access_tag, > this is a string field that has the following structure > "#{project_type_id}-#{client_id}", then I make sure this is created > after save each time. > > Then add it to the ts index as: > has search_access_tag > > Then in the search I do: > access_tags = ProjectAccess.find(:all, :conditions => {:user_id => > current_user.id}).collect { |access| access.search_access_tag } # > Where the identical string access_tags are created from the > project_type_id and client_id for that user > @search_results = ThinkingSphinx.search params[:search], :page => > params[:page], :retry_stale => true, :order > => :created_at, :sort_mode > => :desc, :with=>{:search_access_tag=>access_tags} > > This all works roughly as expected and seems to be fast. > > Until I try this for testing I have a problem: > > 1. access_tags = [] # Empty, hoping for 0 results > @search_results = ThinkingSphinx.search params[:search], :page => > params[:page], :retry_stale => true, :order > => :created_at, :sort_mode > => :desc, :with=>{:search_access_tag=>access_tags} > > This seems to disables the access filtering and all projects are > returned - I would have expected no projects to be returned. > > 2. access_tags = ["CJNFDHJH"] # Random nonsense to try to get 0 > returns > @search_results = ThinkingSphinx.search params[:search], :page => > params[:page], :retry_stale => true, :order > => :created_at, :sort_mode > => :desc, :with=>{:search_access_tag=>access_tags} > > This returns 5 projects all from the same project type. I've checked > and there seems to be nothing special about this one project type. > > I would have thought that has and with on a string would be an exact > string match so if the string is not found in the :with array it would > not return any results. > > From the ts generated config, here are the bits related to > search_access_tag: > > sql_query = .... IFNULL(`projects`.`search_access_tag`, '') AS > `search_access_tag` .... > sql_attr_str2ordinal = search_access_tag > > Any ideas? > > Warm regards, > Robert > > On Jun 29, 8:38 am, rbjarnason <[email protected]> wrote: > > > > > Hi Pat, > > > Thanks for a quick answer :) > > > Couple of follow up points. > > > With a theoretical limit of about 2500 users and few hundred > > projects. Would the former approach be possible/practical/workable? > > > Reason I'm asking is that we're being asked if it would be possible to > > add another layer of access control where each project would both have > > a project type and a client id and the ProjectAccess would then have > > (project_type_id, client_id, user_id). > > > I guess it would be simpler to collect the user_ids in the index for > > each project with that extra access dimension. > > > Our access filter would look something like this: > > named_scope :filtered, lambda {{ :joins=>"INNER JOIN project_access > > ON project_access.project_type_id = projects.project_type_id AND \ > > > project_access.client_id = projects.client_id", > > :conditions => > > ["project_access.user_id = ?", Thread.current[:user_id]] }} > > > I noticed that you've recently added a :join option to the code, which > > I gathered could be used in this case to collect the ids for the > > index, do you have any example snippets for using this feature? > > > Or would it be possible somehow to combine the project_type_id and > > client_id in the second approach and search :with a combination of the > > two? > > > Warm regards, > > Robert > > > On Jun 29, 4:44 am, Pat Allan <[email protected]> wrote: > > > > Hi Robert > > > > I guess there's two approaches here... you'll either want to store all > > > the user ids that have access to a given project: > > > > has project_type.project_accesses.user_id, :as => :user_ids > > > > However, if you're going to have a lot of users, this may not be the best > > > approach... I would recommend you store the project type id as an > > > attribute instead: > > > > has project_type_id > > > > Then, find out which project types a user has access to: > > > > project_type_ids = ProjectAccess.find(:all, :conditions => {:user_id => > > > current_user.id}).collect { |access| access.project_type_id } > > > > And use that as a filter in the search: > > > > Project.search 'foo', :with => {:project_type_id => project_type_ids} > > > > Hope this helps. > > > > -- > > > Pat > > > > On 29/06/2010, at 11:55 AM, rbjarnason wrote: > > > > > Hi, > > > > > I'm trying to implement search using Thinking Sphinx for Projects that > > > > have access control based on Project Types. > > > > > I have 4 tables I need to work with: > > > > * Project (included in search) > > > > * Project Type (included by association in search) > > > > * User (the logged in user) > > > > * Project Access (which has project_type_id, user_id) > > > > > When logged in, I would only like to return search results for > > > > projects of types that a given user has access to as defined in the > > > > Project Access table. > > > > > I've been looking at this post: "Limiting search results depending on > > > > authorization level" that has given me few clues but I'm still at a > > > > loss how I begin implementing this sort of access control using > > > > Thinking Sphinx. > > > >http://groups.google.com/group/thinking-sphinx/browse_thread/thread/4... > > > > > Any leads would be highly appreciated. > > > > > Warm regards, > > > > Robert Bjarnason > > > > > -- > > > > 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.
