Как мне написать методы уровня класса в моделях рельсов, чтобы они не выполнялись во время задач rake?

У меня есть модель roles в приложении rails, в которой я написал несколько быстрых методов класса. Эти методы, по сути, являются просто удобными оболочками для некоторых часто используемых средств поиска. Но это представляет серьезную проблему. Если я попытаюсь загрузить схему этого приложения на другой компьютер с чистой базой данных, произойдет сбой. Это связано с тем, что задача db:schema:load rake сначала загружает всю среду rails, таким образом загружая методы моего класса, которые ищут запись в базе данных, которая, конечно, еще не существует.

Итак две проблемы:

  1. Я не знаю, понимаю ли я, почему он запускает метод при загрузке.
  2. Я не знаю, как это обойти, если я не спасу ошибки для каждого метода.

Есть ли способ «рельсы» или «рубин», который мне не хватает?

Вот мой пример кода:

Class Role < ActiveRecord::Base

  def self.admin
    find_by_name "Administrator"
  end

  def self.user
    find_by_name "User"
  end

  def self.moderator
    find_by_name "Moderator"
  end


end

И тот же код вкратце: https://gist.github.com/836501

Спасибо за любую помощь.

ОБНОВЛЕНИЕ:

Оказалось, что я забыл поместить вызовы этих методов класса из моих фабрик в сторону блока.

Итак, это:

Factory.define :admin, :parent => :user do |f|
  f.roles [Role.admin]
end

Должно быть так:

Factory.define :admin, :parent => :user do |f|
  f.roles {[Role.admin]}
end

person GitNick    schedule 21.02.2011    source источник
comment
В чем ошибка? Если это неинициализированная константа, и вы действительно используете роль класса, а не роль класса, возникает проблема.   -  person zetetic    schedule 21.02.2011
comment
Не могли бы вы предоставить сообщение об ошибке, которое вы получаете?   -  person Pan Thomakos    schedule 21.02.2011
comment
Может быть, вы используете эти методы где-то в миграциях?   -  person tjeden    schedule 21.02.2011
comment
Неплохо подмечено. Я заметил, что эти методы вызываются из моих определений factory girl factory. Я собираюсь изучить это   -  person GitNick    schedule 22.02.2011


Ответы (1)


Ошибка здесь не в этих методах класса, которые не будут выполняться сами по себе, а в том, как вы их вызываете.

Если вы вызываете Role.admin, Role.user и т. д. в коде инициализации или коде модели в другом месте, он будет выполнять эти области.

Я бы порекомендовал поискать в вашей кодовой базе ссылки на них.

Кроме того, если вы опубликуете трассировку стека ошибки (когда БД еще не заполнена), это может дать ключ к пониманию того, кто их вызывает.

person Winfield    schedule 21.02.2011
comment
Спасибо, обратите внимание на мой комментарий выше. - person GitNick; 22.02.2011
comment
Оказывается, я забыл поместить их в блок в своем заводском определении. Так вот:Factory.define :admin, :parent => :user do |f|; f.roles {[Role.admin]}; end Вместо этого: Factory.define :admin, :parent => :user do |f|; f.roles [Role.admin]; end - person GitNick; 22.02.2011