18

User という ActiveRecord クラスがあります。私は、Restrictable次のようないくつかの引数を取るという懸念を作成しようとしています:

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

どうすればそれを行うことができますか?

4

2 に答える 2

26

私があなたの質問を正しく理解していれば、これはそのような懸念の書き方に関するものであり、 の実際の戻り値に関するものではありません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実際にはこれらの値を許可するのではなく制限しているため、キーは少し奇妙です。

于 2014-11-13T04:01:16.897 に答える
1

このブログ投稿から始めることをお勧めします: https://signalvnoise.com/posts/3372-put-chubby-models-on-a-diet-with-concerns 2 番目の例を確認してください。

懸念事項は、ミックスするモジュールと考えてください。それほど複雑ではありません。

module Restrictable
  extend ActiveSupport::Concern

  module ClassMethods
    def restricted_data(user)
      # Do your stuff
    end
  end
end
于 2014-11-13T03:37:52.140 に答える