метод "scoped" для Rails 2.X ad Rails 3 - PullRequest
4 голосов
/ 30 июля 2010

У меня есть плагин, который я использую для сайтов, использующих Rails 2.X или Rails 3.

В Rails 2.3 я много использовал метод «scoped» для сложных запросов:

p = Person.scoped({})
p = p.active
p = p.with_premium_plan if xyz
p
etc.

Но я увидел, что это изменилось в Rails 3:

p = Person.scoped
etc.

Так это нормально, что мне нужно сделать что-то подобное в моем плагине (чтобы иметь возможность запустить его в обеих версиях Rails), или вы можете предложить что-то более приятное?

if Rails.version.split(".")[0] == "3"
  p = Person.scoped
else
  p = Person.scoped({})
end

Спасибо! Винс

1 Ответ

9 голосов
/ 30 июля 2010

Я бы действительно держался подальше от проверки буквальной версии Rails. Вы просто настраиваете себя на провал, когда выходит Rails 4.

Если вам интересно, принимает ли метод параметр или нет, используйте это:

p = (Person.method(:scoped).arity == 1) ? Person.scoped({ }) : Person.scoped

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

Как говорится, в Rails 2.3.8, похоже, вам не нужно передавать какой-либо параметр в scoped.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...