Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Можно использовать названные объемы в направляющих 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")
Прохладная вещь о named_scopes состоит в том, что они работают над наборами также:
class Post < ActiveRecord::Base
named_scope :published, :conditions => {:status => 'published'}
end
@post = Post.published
@posts = current_user.posts.published
При использовании более старой версии направляющие запрос Honza близок, но необходимо добавить круглые скобки для строк, которые помещаются в В условии:
Person.find(:all, :conditions => ["created_at > ? AND name IN (?)", date, names])
Используя В может быть ассортимент: это является самым быстрым для целых чисел и самым медленным для списка строк. Если Вы используете всего одно имя, определенно используйте, равняется оператору:
Person.find(:all, :conditions => ["created_at > ? AND name = ?", date, name])
Для больше на 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
Если Вы собираетесь передать в переменных своим объемам, необходимо использовать лямбду.
Именованные объемы, уже предложенные, прекрасны довольно. Классический способ сделать это был бы:
names = ["dave", "jerry", "mike"]
date = DateTime.now
Person.find(:all, :conidtions => ["created_at > ? AND name IN ?", date, names])
Я думаю, что или собираюсь использовать простые средства поиска AR или Searchgasm.