8

У меня есть класс ActiveRecord под названием User. Я пытаюсь создать беспокойство под названием Restrictable, который принимает в некоторых аргументах, как это:Как создать Rails 4 Концерн, который принимает аргумент

class User < ActiveRecord::Base 
    include Restrictable # Would be nice to not need this line 
    restrictable except: [:id, :name, :email] 
end 

Я хочу, чтобы затем предоставить метод экземпляра под названием restricted_data, который может выполнять некоторые операции на этих аргументах и ​​возвращать некоторые данные. Пример:

user = User.find(1) 
user.restricted_data # Returns all columns except :id, :name, :email 

Как бы я это сделал?

ответ

13

Если я правильно понимаю ваш вопрос, это о том, как написать такую ​​озабоченность, а не о реальной стоимости возвращаемого restricted_data. Я хотел бы реализовать концерн скелет, как, например:

require "active_support/concern" 

module Restrictable 
    extend ActiveSupport::Concern 

    module ClassMethods 
    attr_reader :restricted 

    private 

    def restrictable(except: []) # Alternatively `options = {}` 
     @restricted = except  # Alternatively `options[:except] || []` 
    end 
    end 

    def restricted_data 
    "This is forbidden: #{self.class.restricted}" 
    end 
end 

Тогда вы можете:

class C 
    include Restrictable 
    restrictable except: [:this, :that, :the_other] 
end 

c = C.new 
c.restricted_data #=> "This is forbidden: [:this, :that, :the_other]" 

Это будет соответствовать интерфейсу вы разработан, но ключ except немного странно, потому что это на самом деле ограничения этих значений вместо того, чтобы разрешать их.

0

Предлагаю начать с этого сообщения в блоге: https://signalvnoise.com/posts/3372-put-chubby-models-on-a-diet-with-concerns Оформить заказ второго примера.

Думайте о проблемах как о модуле, в котором вы смешиваете. Не слишком сложно.

module Restrictable 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def restricted_data(user) 
     # Do your stuff 
    end 
    end 
end