user:owns in item search

This commit is contained in:
Emi Matchu 2011-07-17 17:24:29 -04:00
parent eac0d327f9
commit 884ad2d5b8
3 changed files with 34 additions and 10 deletions

View file

@ -10,7 +10,7 @@ class ItemsController < ApplicationController
else else
per_page = nil per_page = nil
end end
@items = Item.search(@query).alphabetize.paginate :page => params[:page], :per_page => per_page @items = Item.search(@query, current_user).alphabetize.paginate :page => params[:page], :per_page => per_page
assign_closeted! assign_closeted!
respond_to do |format| respond_to do |format|
format.html { render } format.html { render }

View file

@ -43,6 +43,8 @@ class Item < ActiveRecord::Base
scope :sitemap, select([:id, :name]).order(:id).limit(49999) scope :sitemap, select([:id, :name]).order(:id).limit(49999)
scope :with_closet_hangers, joins(:closet_hangers)
def closeted? def closeted?
!!@closeted !!@closeted
end end
@ -118,7 +120,7 @@ class Item < ActiveRecord::Base
@supported_species ||= species_support_ids.blank? ? Species.all : species_support_ids.sort.map { |id| Species.find(id) } @supported_species ||= species_support_ids.blank? ? Species.all : species_support_ids.sort.map { |id| Species.find(id) }
end end
def self.search(query) def self.search(query, user=nil)
raise SearchError, "Please provide a search query" unless query raise SearchError, "Please provide a search query" unless query
query = query.strip query = query.strip
raise SearchError, "Search queries should be at least 3 characters" if query.length < 3 raise SearchError, "Search queries should be at least 3 characters" if query.length < 3
@ -146,7 +148,7 @@ class Item < ActiveRecord::Base
limited_filters_used << condition.filter limited_filters_used << condition.filter
end end
end end
condition.narrow(scope) condition.narrow(scope, user)
end end
end end
@ -616,6 +618,7 @@ class Item < ActiveRecord::Base
name = name.to_s name = name.to_s
SearchFilterScopes << name SearchFilterScopes << name
LimitedSearchFilters << name if options[:limit] LimitedSearchFilters << name if options[:limit]
(class << self; self; end).instance_eval do (class << self; self; end).instance_eval do
if options[:full] if options[:full]
define_method "search_filter_#{name}", &options[:full] define_method "search_filter_#{name}", &options[:full]
@ -633,9 +636,9 @@ class Item < ActiveRecord::Base
search_filter name, options, &block search_filter name, options, &block
end end
def self.search_filter_block(options, positive) def self.search_filter_block(options, positive, &block)
Proc.new { |str, scope| Proc.new { |str, user, scope|
condition = yield(str) condition = block.arity == 1 ? block.call(str) : block.call(str, user)
condition = "!(#{condition.to_sql})" unless positive condition = "!(#{condition.to_sql})" unless positive
scope = scope.send(options[:scope]) if options[:scope] scope = scope.send(options[:scope]) if options[:scope]
scope.where(condition) scope.where(condition)
@ -664,6 +667,27 @@ class Item < ActiveRecord::Base
filter filter
end end
def self.validate_user_condition(adjective, user)
unless adjective == "owns"
raise SearchError, "We don't understand user:#{adjective}. " +
"Did you mean user:owns?"
end
unless user
raise SearchError, "It looks like you're not logged in, so you don't own any items."
end
end
single_search_filter :user, :full => lambda { |adjective, user, scope|
validate_user_condition(adjective, user)
scope.joins(:closet_hangers).where(ClosetHanger.arel_table[:user_id].eq(user.id))
}
single_search_filter :not_user do |adjective, user|
validate_user_condition(adjective, user)
arel_table[:id].not_in(user.closeted_items.map(&:id))
end
search_filter :only do |species_name| search_filter :only do |species_name|
begin begin
id = Species.require_by_name(species_name).id id = Species.require_by_name(species_name).id
@ -694,7 +718,7 @@ class Item < ActiveRecord::Base
SwfAsset.arel_table[:zone_id].in(zone_set.map(&:id)) SwfAsset.arel_table[:zone_id].in(zone_set.map(&:id))
end end
single_search_filter :not_type, :full => lambda { |zone_set_name, scope| single_search_filter :not_type, :full => lambda { |zone_set_name, user, scope|
zone_set = Zone::ItemZoneSets[zone_set_name] zone_set = Zone::ItemZoneSets[zone_set_name]
raise SearchError, "Type \"#{zone_set_name}\" does not exist" unless zone_set raise SearchError, "Type \"#{zone_set_name}\" does not exist" unless zone_set
psa = ParentSwfAssetRelationship.arel_table.alias psa = ParentSwfAssetRelationship.arel_table.alias
@ -742,10 +766,10 @@ class Item < ActiveRecord::Base
@positive = !@positive @positive = !@positive
end end
def narrow(scope) def narrow(scope, user)
if SearchFilterScopes.include?(filter) if SearchFilterScopes.include?(filter)
polarized_filter = @positive ? filter : "not_#{filter}" polarized_filter = @positive ? filter : "not_#{filter}"
Item.send("search_filter_#{polarized_filter}", self, scope) Item.send("search_filter_#{polarized_filter}", self, user, scope)
else else
raise SearchError, "Filter #{filter} does not exist" raise SearchError, "Filter #{filter} does not exist"
end end

View file

@ -3,7 +3,7 @@
- content_for :before_flashes do - content_for :before_flashes do
= link_to "Import closet from Neopets", new_closet_page_path, :id => 'import-link' = link_to "Import closet from Neopets", new_closet_page_path, :id => 'import-link'
= form_tag items_path, :method => :get, :id => 'closet-hangers-items-search', 'data-current-user-id' => current_user.id do = form_tag items_path, :method => :get, :id => 'closet-hangers-items-search', 'data-current-user-id' => current_user.id do
= search_field_tag :q, nil, :placeholder => "Search items" = search_field_tag :q, nil, :placeholder => "Find items to add"
= submit_tag 'Search', :name => nil = submit_tag 'Search', :name => nil
- else - else
- title "#{@user.name}'s Items" - title "#{@user.name}'s Items"