Объедините два именованных объема с ИЛИ (вместо И)

Несколько панелей намного лучше. Одна из главных причин для использования UpdatePanels вообще состоит в том, чтобы уменьшить трафик и только отправить части, в которых Вы нуждаетесь назад и вперед через провод. Только используя одну панель обновления, Вы в значительной степени делаете, полное сообщение отступают каждый раз, когда Вы просто используете немного JavaScript для обновления страницы без мерцания.

, Если существуют части страницы, которая должна быть обновлена вместе, существуют способы инициировать другие панели для обновления, когда каждый делает.. но необходимо определенно использовать несколько панелей обновления.

7
задан Tom Lehman 27 September 2009 в 06:34
поделиться

2 ответа

Разве результаты «нравится» не будут также включать результаты «равно»?

Вы также можете использовать именованную область на конце другой, чтобы создать действительно длинную именованную область. Из 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
1
ответ дан 6 December 2019 в 21:16
поделиться

Я не смог найти никаких простых решений, но эта проблема меня заинтриговала, поэтому я выбрал собственное решение:

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
9
ответ дан 6 December 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: