0

Railscastsのエピソード189では、ユーザーモデルに次のような名前付きスコープがあります。

field :roles_mask,      :type => Integer
ROLES = %w[admin moderator author]

named_scope :with_role, lambda { |role| {:conditions => "roles_mask & #{2**ROLES.index(role.to_s)} > 0"} }

 # roles related
 def roles=(roles)
  self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum
 end

 def roles
   ROLES.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? }
 end

 def role_symbols
  roles.map(&:to_sym)
 end

いくつかのオプションを試しても機能しなかったので、Mongoidでどのように機能させるのでしょうか?

4

2 に答える 2

4

Railscastsのそのエピソードは、実際には、ネイティブ型として配列をサポートしていないデータベース用に設計されました(Mongoidはサポートしています)。次に、配列クエリ条件の1つを使用するスコープを作成できます。

例えば:

class User
  include Mongoid::Document

  field :email
  field :roles, :type => Array

  ROLES = %w[admin moderator author]

  class << self
    def with_role(*args)
      any_in(:roles => args)
    end
  end
end

この例では、単一のロールUser.with_role("admin")またはロールの配列のいずれかを渡すことができUser.with_role("moderator", "author")、後者はモデレーターまたは作成者のいずれかであるユーザーを返します。

于 2011-06-07T03:27:19.400 に答える
0

for_jsメソッドhttp://www.rubydoc.info/github/mongoid/mongoid/Mongoid/Criteria:for_jsを使用して、mongoidを介して公開されるネイティブマップreducemongoDBメカニズムを使用でき ます。

ROLES.each_with_index do |role, role_index|
  scope "#{role.to_s.pluralize}", -> { self.for_js("(this.roles_mask & (1 << role_val)) > 0", role_val: role_index) }
end

これにより、次の形式でスコープが提供されます。

User.admins
User.moderators
User.authors
于 2014-10-25T13:32:10.593 に答える