У меня есть следующие Siteable
беспокойства:ActiveRecord Концерн спекуляция терпит неудачу, когда использует self.class
module Siteable
extend ActiveSupport::Concern
included do
belongs_to :site
scope :by_site, lambda { |site| where(site_id: site.try(:id)) }
scope :for_site, lambda { |site| by_site self.class.by_site(site).any? ? site : nil }
end
end
Пример модель с этим беспокойством:
class IndustryLink < LinkResource
require 'concerns/siteable.rb'
include Siteable
belongs_to :author, :class_name => 'User'
belongs_to :industry
validates_presence_of :name, :link
end
Он работает отлично на сервере. Но все данные с этой моделью терпит неудачу с подобными ошибками:
Failure/Error: industry = Factory(:industry, :name => 'new industry')
NoMethodError:
undefined method `by_site' for Class:Class
# ./app/models/concerns/siteable.rb:8:in `block (2 levels) in <module:Siteable>'
# ./app/models/industry_link.rb:12:in `get_objects'
# ./app/models/concerns/reorderable.rb:47:in `add_number'
# ./spec/views/sitemap/show.xml.builder_spec.rb:41:in `block (2 levels) in <top (required)>'
Таким образом, очевидно, что self.class
не в этом случае Industry
, и я не знаю, как это исправить.
Если я переведу for_site
, чтобы модель и изменить self.class
до Industry
Технические характеристики проходит.
Проверено рубин 1.9.3, 2.1.1, Rails 3.2.19
Вы включаете модуль, что означает, что методы доступны для экземпляров объектов. Вы пытались расширить модуль, а не включать его. Затем он добавит методы в модуле как методы класса. –
Забудьте об этом, я попробую сейчас. – zishe
Не работает. Это действительно правильный способ, когда беспокойство вызывает расширение ActiveSupport :: Concern и модель 'include'. – zishe