Смешивание ActiveRecord находит Условия

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
9
задан Tony Pitale 17 September 2008 в 14:14
поделиться

6 ответов

Можно использовать названные объемы в направляющих 2.1 и выше

Class Test < ActiveRecord::Base
  named_scope :created_after_2005, :conditions => "created_on > 2005-01-01"
  named_scope :named_fred, :conditions => { :name => "fred"}
end

затем можно сделать

Test.created_after_2005.named_fred

Или можно дать named_scope лямбду, разрешающую Вам передать в аргументах

Class Test < ActiveRecord::Base
  named_scope :created_after, lambda { |date| {:conditions => ["created_on > ?", date]} }
  named_scope :named, lambda { |name| {:conditions => {:name => name}} }
end

затем можно сделать

Test.created_after(Time.now-1.year).named("fred")
27
ответ дан 4 December 2019 в 06:27
поделиться

Прохладная вещь о named_scopes состоит в том, что они работают над наборами также:

class Post < ActiveRecord::Base
  named_scope :published, :conditions => {:status => 'published'}
end

@post = Post.published

@posts = current_user.posts.published
2
ответ дан 4 December 2019 в 06:27
поделиться

При использовании более старой версии направляющие запрос Honza близок, но необходимо добавить круглые скобки для строк, которые помещаются в В условии:

Person.find(:all, :conditions => ["created_at > ? AND name IN (?)", date, names])

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

Person.find(:all, :conditions => ["created_at > ? AND name = ?", date, name])
7
ответ дан 4 December 2019 в 06:27
поделиться

Для больше на named_scopes см. объявление Ryan и Railscast на named_scopes

class Person < ActiveRecord::Base
  named_scope :registered, lambda { |time_ago| { :conditions => ['created_at > ?', time_ago] } }
  named_scope :with_names, lambda { |names| { :conditions => { :names => names } } }
end

Если Вы собираетесь передать в переменных своим объемам, необходимо использовать лямбду.

1
ответ дан 4 December 2019 в 06:27
поделиться

Именованные объемы, уже предложенные, прекрасны довольно. Классический способ сделать это был бы:

names = ["dave", "jerry", "mike"]
date = DateTime.now
Person.find(:all, :conidtions => ["created_at > ? AND name IN ?", date, names])
0
ответ дан 4 December 2019 в 06:27
поделиться

Я думаю, что или собираюсь использовать простые средства поиска AR или Searchgasm.

0
ответ дан 4 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

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