To get a OR situation like that, you'll need to generate an attribute  
by hand. Assuming you're using MySQL:

   has "(active = 1 OR final_at IS NOT NULL)", :as => :active, :type  
=> :boolean

And then add :active => 1 to your :with hash :)

-- 
Pat

On 21/04/2009, at 8:52 PM, Peter Tellgren wrote:

> Pat,
>
> Thank you for all the help my search code now finaly looks ok and  
> works as anticipated,
> there is ofcourse one more thing I am unable to figure out...
>
> The client has 2 fields in his db active & final_at
> where active is a bool and final_at is a timestamp
>
> to make the search accurate we need to include all the books that  
> are active (simple active => 1)
> or has a final_at not equal to NULL
>
> it is this or statement I am struggling with.
>
> Hope you are able to help..
>
> --
> Peter
>
> On Mon, Apr 20, 2009 at 3:44 PM, Pat Allan <p...@freelancing- 
> gods.com> wrote:
> What about the following...
>
>   filters = {}
>   filters[:tag_ids] = params[:g] unless params[:g].empty?
>
> And then :with => filters in your search query?
>
> -- 
> Pat
>
> On 20/04/2009, at 10:55 PM, Peter Tellgren wrote:
>
>> Ahhhh,
>> thanks that indeed explains what is going on.
>>
>> My issue now is how do I solve my :with filter for my tags in the  
>> best way..
>>
>> params[:g] ||= []
>>
>> :with => { tag_ids => params[:g] } does not work when params[:g] is  
>> empty
>> but of course so does
>> :with_all => { tag_ids => params[:g] } but it is not the way I want  
>> it to work.
>>
>> Any ideas ?
>>
>>
>> On Mon, Apr 20, 2009 at 2:24 PM, Pat Allan <p...@freelancing- 
>> gods.com> wrote:
>> The reason is attribute filters are different to fields.
>>
>> For example, :conditions => {:country => "Melbourne"} becomes  
>> "@country Melbourne" when sent through to Sphinx - as that's how it  
>> expects field-specific searches. And they get appended to the main  
>> query.
>>
>>   Book.search "Discworld", :conditions => {:country => "United  
>> Kingdom"}
>>   # is sent to Sphinx as:
>>   "Discworld @country United Kingdom"
>>
>> If you specified nothing for country, then that would become  
>> "Discworld @country" - and so it has nothing to match on the  
>> country field.
>>
>> Filters are completely separate - they are not part of the query  
>> string, but sent through to the Sphinx daemon one by one. Nil is  
>> treated as 0 by Sphinx, and so can be a valid match.
>>
>> Not the best description I've written, but hopefully it sheds some  
>> light.
>>
>> Cheers
>>
>> -- 
>> Pat
>>
>> On 20/04/2009, at 10:07 PM, Peter Tellgren wrote:
>>
>>> Thanks Pat,
>>>
>>> the ||= is indeed cleaner :)
>>>
>>> however, I am unsuccessful with building the conditions hash.
>>>
>>> Whatever I do I end up with an empty result, so for now I will  
>>> stick to my previous..
>>>
>>> something that confuses me though is, how come :countries work  
>>> even if the params[:c] is empty("") or nil where as my :type makes  
>>> the search
>>> return 0 found if the params[:t] is nil or empty?
>>>
>>> the same goes for my tags. if I supply no tags but an empty array  
>>> (params[:g] ||= []) I end up with no results..
>>>
>>> all comments are welcome.
>>>
>>>
>>> On Mon, Apr 20, 2009 at 1:38 PM, Pat Allan <p...@freelancing- 
>>> gods.com> wrote:
>>> Hi Peter
>>>
>>> You could change it to
>>>
>>> params[:t] ||= [1,2]
>>>
>>> Which is slightly cleaner. Looks like I misunderstood the issue  
>>> the first time around. The best approach is perhaps to build your  
>>> conditions hash, perhaps as follows:
>>>
>>> conditions = {:author_country => params[:c]}
>>> conditions[:type] = params[:t] if params[:t]
>>>
>>> Book.search params[:q], conditions, :with => {:tag_ids =>  
>>> params[:g]}, :page => params[:page]
>>>
>>> You should be able to shift the field weights into your  
>>> define_index block too, if you want them to *always* apply.
>>>
>>>   set_property :field_weights => {
>>>     "book_name"   => 20,
>>>     "author_name" => 15,
>>>     "book_desc"   => 15,
>>>     "author_bio"  => 10
>>>   }
>>>
>>> Hope this helps.
>>>
>>> Cheers
>>>
>>> -- 
>>> Pat
>>>
>>> On 20/04/2009, at 9:32 PM, Peter Tellgren wrote:
>>>
>>>> Hi Pat,
>>>>
>>>> Here is my define block
>>>>
>>>>  define_index do
>>>>     # fields
>>>>     indexes name, :as => :book_name
>>>>     indexes user.freetext, :as => :author_bio
>>>>     indexes content, :as => :book_desc
>>>>     indexes [user.firstname, user.lastname], :as => :author_name
>>>>     indexes user.country, :as => :author_country
>>>>
>>>>     # attributes
>>>>     has user.taggings.tag(:id), :as => :tag_ids
>>>>     has created_at, :as => :book_created
>>>>     has book_type_id, :as => :type
>>>>  end
>>>>
>>>> I actually solved the it with this somewhat ugly metod in my  
>>>> controller
>>>>
>>>> params[:t] = [1,2] unless params[:t]
>>>>
>>>> which then allowed me to use the following search call:
>>>>
>>>>  @books = Book.search params[:q],
>>>>         :conditions => {
>>>>           :author_country => params[:c],
>>>>           :type  => params[:t]
>>>>          },
>>>>         :field_weights => {
>>>>           :book_name => 20,
>>>>           :author_name => 15,
>>>>           :book_desc => 15,
>>>>           :author_bio => 10
>>>>         }
>>>>         :with => {
>>>>           :tag_ids => params[:g]
>>>>        },
>>>>         :per_page => 20,
>>>>         :page => (params[:page] || 1)
>>>>
>>>> If I am doing something very wrong here I am happy to find  
>>>> out :D.. a bit of a newbie regarding search so eager to learn
>>>>
>>>> On Mon, Apr 20, 2009 at 1:17 PM, Pat Allan <[email protected] 
>>>> > wrote:
>>>>
>>>> Hi Peter
>>>>
>>>> What's your define_index block looking like? You'll probably need  
>>>> an
>>>> attribute for book_type_id, and then use :with  
>>>> (although :conditions
>>>> will work too, but I recommend keeping filters (for attributes
>>>> -- :with) and query arguments (for fields -- :conditions) separate.
>>>>
>>>> Cheers
>>>>
>>>> --
>>>> Pat
>>>>
>>>> On 20/04/2009, at 7:39 PM, peter_tellgren wrote:
>>>>
>>>> >
>>>> > Dear all
>>>> > I am struggling a bit here with my advance search form where I  
>>>> want my
>>>> > users to be able to find books.
>>>> > I have in my search a select with 3 options, All, Paperback and
>>>> > Hardcover.
>>>> >
>>>> > What I got in my db is a column with book_type_id 1 =  
>>>> paperback, 2 =
>>>> > Hardcover.
>>>> >
>>>> > The problem I am having is that my all option is returning no  
>>>> results
>>>> > since there are no records with the id = 0.
>>>> >
>>>> > How do I solve this i my case?
>>>> >
>>>> > I have tried:
>>>> > Book.search params[:q], :conditions => { :type => params[:t] }
>>>> > Book.search params[:q], :with => { :type => params[:t] }
>>>> >
>>>> > with both I get no result when params[:t] is not passed (i.e. all
>>>> > types interestin).
>>>> >
>>>> > grateful for any help.
>>>> > >
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>
>>
>>
>>
>>
>>
>>
>
>
>
>
>
> >


--~--~---------~--~----~------------~-------~--~----~
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