Как избежать nil с помощью динамического поиска, когда атрибут имеет значение nil? - PullRequest
2 голосов
/ 21 января 2011
link_to 'articles', articles_path, :attr1 => 'foo', :attr2 => 'bar' 

А в контроллере:

Article.find_all_by_attr1_and_attr2(params[:attr1], params[:attr2])

Однако, если контроллер получает только [:attr1], я получаю ноль.

1 Ответ

2 голосов
/ 21 января 2011

Динамические искатели могут быть неправильным способом, если некоторые из искателей фактически отсутствуют. В этом случае вам, вероятно, лучше использовать Article.find(:all, :conditions => {}) на Rails 2 и Article.where() на Rails 3.

Вот метод, который я придумал для другого вопроса некоторое время назад:

conditions = [:attr1, :attr2].inject({}) do |hsh, field|
  hsh[field] = params[field] if params[field] && params[field].present?
  hsh
end

# Rails 2
@articles = Article.find(:all, :conditions => conditions)

# Rails 3
@articles = Article.where(conditions)

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

...