Могут ли модули добавлять отношения и named_scopes в модели Rails - PullRequest
1 голос
/ 28 июня 2009

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

Вот что у меня сейчас есть:

module Resource

has_many(:permissions)
  named_scope(
        :acl_check,
        lambda do |user_id, method| {
            :include => :permission,
            :conditions => [
                ["permissions.user_id=?", user_id],
                ["permissions.method=?", method],
                ["permissions.classname=?", self.class.name]
        ]
    }
  end)

end

Хотя при попытке запустить сервер я получаю следующую ошибку:

......config/initializers/Resources.rb:5: undefined method `named_scope' for Resource:Module (NoMethodError)

Спасибо всем, кто откликнулся! :)

Ответы [ 2 ]

2 голосов
/ 28 июня 2009

Вы хотите переопределить метод selected () или extended () в модуле, который вызывается всякий раз, когда модуль (на удивление) включается или расширяется. Что-то вроде следующего должно делать то, что вы хотите:

module Foo
  def self.extended (base)
    base.class_eval do
      has_many :doodads
    end
  end
end

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

0 голосов
/ 28 июня 2009

Метод, вызываемый в моделях, будет вызываться, когда Ruby видит модуль, а не когда он включен.

module MyModule
  running_a_class_method
end
# => NameError: undefined local variable or method ‘running_a_class_method’ for MyModule:Module

Вы должны убедиться, что вызов этого метода класса выполняется, когда модуль включен. В Ruby есть обработчик событий для включения, included. Класс / модуль, в который вы его включаете, передается в качестве аргумента этому методу.

module MyModule
  def self.included(base)
    puts base
  end
end

class Thing
  include MyModule
  # => Thing
end

Пример, который ближе к тому, чего вы хотите достичь:

module Resource
  def self.included(base)
    base.has_many :permissions
    base.named_scope :foos, :conditions => ["..."]
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...