1

У меня есть следующие 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

+0

Вы включаете модуль, что означает, что методы доступны для экземпляров объектов. Вы пытались расширить модуль, а не включать его. Затем он добавит методы в модуле как методы класса. –

+0

Забудьте об этом, я попробую сейчас. – zishe

+0

Не работает. Это действительно правильный способ, когда беспокойство вызывает расширение ActiveSupport :: Concern и модель 'include'. – zishe

ответ

1

В вашей лямбда я уже модель класса - Industry, поэтому self.class является Class

Вы должны просто использовать by_site (возможно, сначала его не назову, в зависимости от того, что вам нужно)

+0

Спасибо, 'self.unscoped' отлично работает. – zishe