Модуль Rails с Mongoid - PullRequest
       4

Модуль Rails с Mongoid

5 голосов
/ 09 марта 2012

Я пытаюсь расширить несколько моих классов моделей до класса «Актив».Каждый из четырех типов активов сможет генерировать слаг из set_callback(:save, :before) Следовательно, вместо того, чтобы писать четыре одинаковых метода, я бы хотел, чтобы они расширили класс Asset, у которого был бы set_callback (а такжедругие методы).

Сначала я попытался просто расширить их класс Asset, но столкнулся с проблемами, когда при сохранении одного из активов в базу данных (mongo) коллекция, в которую они вставляли, называлась скорее Assetчем их собственное имя.

После того, как я погуглил, люди, кажется, рекомендуют вместо этого использовать модули.Итак, я попробовал это:

module Asset
  field :slug, :type => String

  set_callback(:save, :before) do |document|
    # make document.slug = to whatever
  end
end

class Video
  include Mongoid::Document
  include Asset
  field :video_name, :type => String
  field :description, :type => String
  field :some_more_fields, :type => String
end

Но я получаю некоторые ошибки, когда я включаю Актив:

'undefined method `field' for Asset:Module'

Примечание: я использую Mongoid

Ответы [ 2 ]

7 голосов
/ 09 марта 2012

Поле метода неизвестно в контексте модуля Актив.Таким образом, вы должны вызывать поле только тогда, когда модуль включен:

  module Asset
    def self.included(base)
      base.send(:field, :slug, :type => String)
    end
  end

Редактировать: завернутый код в блок кода

2 голосов
/ 09 декабря 2013

Хорошо, использование проблем делает это намного проще и приятнее писать:

module Asset
 include extend ActiveSupport::Concern
  included do
   field: slug, type: String
   before_create: :notify_on_create
   scope: my_scope, ->(var) { where(slug: var) }
  end
 end
end

Подробнее см. http://api.rubyonrails.org/classes/ActiveSupport/Concern.html.

...