Несколько панелей намного лучше. Одна из главных причин для использования UpdatePanels вообще состоит в том, чтобы уменьшить трафик и только отправить части, в которых Вы нуждаетесь назад и вперед через провод. Только используя одну панель обновления, Вы в значительной степени делаете, полное сообщение отступают каждый раз, когда Вы просто используете немного JavaScript для обновления страницы без мерцания.
, Если существуют части страницы, которая должна быть обновлена вместе, существуют способы инициировать другие панели для обновления, когда каждый делает.. но необходимо определенно использовать несколько панелей обновления.
Разве результаты «нравится» не будут также включать результаты «равно»?
Вы также можете использовать именованную область на конце другой, чтобы создать действительно длинную именованную область. Из Searchlogic Docs (этот способ кажется мне немного длинным):
User.username_or_first_name_like("ben")
=> "username LIKE '%ben%' OR first_name like'%ben%'"
User.id_or_age_lt_or_username_or_first_name_begins_with(10)
=> "id < 10 OR age < 10 OR username LIKE 'ben%' OR first_name like'ben%'"
Или вы можете использовать объединение для объединения массивов результатов поиска при удалении дубликатов:
@equal_results = Annotation.body_equals('?')
@like_results = Annotation.body_like('[?]')
@results = @equal_results | @like_results
Я не смог найти никаких простых решений, но эта проблема меня заинтриговала, поэтому я выбрал собственное решение:
class ActiveRecord::Base
def self.or_scopes(*scopes)
# Cleanup input
scopes.map! do |scope|
scope = scope.respond_to?(:to_a) ? scope.to_a : [*scope]
scope.unshift(scope.shift.to_sym)
end
# Check for existence of scopes
scopes.each{|scope| raise ArgumentError, "invalid scope: #{scope.first}" unless self.scopes.has_key?(scope.first) }
conditions = scopes.map do |scope|
scope = self.scopes[scope.first].call(self, *scope[1..-1])
self.merge_conditions(scope.proxy_options[:conditions])
end
or_conditions = conditions.compact.join(" OR ")
merged_scopes = scopes.inject(self){|merged, scope| merged.scopes[scope.first].call(self, *scope[1..-1]) }
# We ignore other scope types but so does named_scopes
find_options = merged_scopes.scope(:find).merge(:conditions => or_conditions)
self.scoped(find_options)
end
end
Рассмотрим следующую схему:
class Person < ActiveRecord::Base
named_scope :men, :conditions => { :sex => 'M' }
named_scope :women, :conditions => { :sex => 'F' }
named_scope :children, :conditions => "age < 18"
named_scope :named, lambda{|name|
{ :conditions => { :name => name } }
}
end
Вы называете ее именами ряд областей как таковых:
Person.or_scopes(:women, :children)
Это возвращает область, подобную этой:
Person.or_scopes(:women, :children).proxy_options
# => {:conditions=>"(`people`.`sex` = 'F') OR (age < 18)"}
Вы также можете вызвать ее с массивом массивов, когда область требует параметров:
Person.or_scopes(:women, [:named, 'Sue']).proxy_options
# => {:conditions=>"(`people`.`sex` = 'F') OR (`people`.`name` = 'Sue')"}
В вашем случае Horace вы можете использовать следующее:
Annotation.or_scopes([:body_equals, '?'], [:body_like, '[?']).all