Как выдать «найти» или «где», который вызывает RecordNotFound - PullRequest
9 голосов
/ 08 марта 2012

Когда я вызываю находку с идентификатором, она становится целевой находкой и выдает ошибку RecordNotFound.

Foo::Bar.find(123) # RecordNotFound if no Bar with id 123 exists.

Но когда я звоню с условиями, я получаю ноль, если не найден:

Foo::Bar.find(:first, :conditions => [ "lower(name) = ?", name.downcase ])

Я хочу, чтобы такой условный поиск тоже выдавал ошибку. Я знаю, что могу сделать:

Foo::Bar.find_by_name!("CocktailBar") #=> raises Recordnotfount if not not found.

Но это только очень простые условия. Моя нужна немного больше сложности; на самом деле что-то вроде:

Foo.Bar.select{ |pm| pm.name.downcase =~ /cocktail/}.first

И, если ничего не найдено, я хочу, чтобы он вызвал ошибку RecordNotFound. Это возможно вообще? Или я должен просто добавить код для проверки на ноль? а если ноль? поднять ошибку сам? И если да, то как мне это сделать в Rails 3?

Ответы [ 2 ]

45 голосов
/ 20 марта 2012

В последнем фрагменте кода вы фактически извлекаете все записи из БД и затем делаете select для массива Ruby. Это не имеет ничего общего с ActiveRecord, поэтому вы можете делать все, что угодно, чтобы вызвать исключение вручную, либо использовать код, предложенный Дугласом, либо if, либо unless и т. Д. понять, что делает ваш код. Ваш select {...} не переведен в SQL SELECT ... WHERE(...).

Если вам нужно, чтобы исключение автоматически вызывалось запросом ActiveRecord, используйте это:

Foo::Bar.where([ "lower(name) = ?", name.downcase ]).first!

Эквивалентные методы bang существуют и для методов find_by, например Foo::Bar.find_by_name!(name)

3 голосов
/ 08 марта 2012

Ваш последний параграф - это то, что вам нужно сделать. Либо проверяйте на ноль, либо поднимайте исключения самостоятельно. Чтобы поднять исключение самостоятельно, сделайте следующее:

Foo::Bar.find(:first, :conditions => [ "lower(name) = ?", name.downcase ]) || raise(ActiveRecord::RecordNotFound)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...