1

Railsアプリケーションですべてのモデルに対してnamed_scopeを定義しようとしています。すべてのモデルでnamed_scopesとその他のActiveRecordリレーションシップを定義しようとしています

現在のところ、私はActiveRecord :: Base用のイニシャライザを作成し、そこに通常のメソッドを配置することで、これに近づくことができました。 もちろん、これはクエリチェーンの作成に関しては本当の利点はありません。おそらく、仕事を終わらせるための最も難しい方法です。

しかし、私はhas_many、named_scopeなどを試してみるとうまくいきません。ActiveRecordメソッド。

named_scopeが正しくない可能性があることを理解していますが、実際にはnamed_scopeを定義する手助けが必要です。また、私は現在Ruby ACL GEMに興味がありません。

で初期化子/:

class ActiveRecord::Base 

    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) 

    # Conducts a permission check for the current instance. 
    def check_acl?(user_id, method) 

     # Perform the permission check by User. 
     permission_check = Permission.find_by_user_id_and_instance_id_and_classname_and_method(user_id, self.id, self.class.name, method) 
     if(permission_check) 
      # If the row exists, we generate a hit. 
      return(true) 
     end 

     # Perform the permission check by Role. 

     # Otherwise, the permissions check was a miss. 
     return(false) 

    end 

end 

答えて

1

それはクラス本体で評価し、期待される外部キーは、それが継承するクラスではなく、評価されたクラスのためのものですされているため、has_manyはおそらく動作しません。 (例えば、id = 42のブログモデルはblog_id = 42で保存された多くのコメントモデルを持つことができ、それを動作させるために必要なキーはクラス名に基づいています)

名前が正しい場合は有効です。

継承されたメソッドは機能するはずです。

+0

私のアプリのすべてのモデルにnamed_scopesを追加するために使用できる代替方法はありますか? 通常、私はこのメソッドで大丈夫ですが、named_scopeのようにチェーンに参加できません。また、単純なメソッドを使用すると、より多くのクエリのアクティビティとオーバーヘッドがあります。 –

+0

あなたが行っているように名前付きスコープを定義すると、それは自分のアプリケーションで機能します。代わりに、http://www.harukizaemon.com/2006/10/abstract-activerecord-classes-by.htmlのような抽象的なactiverecordクラスを使用して、通常の継承を使用することもできます。 has_manyなどを取得するには、ほとんどの場合、各モデルのクラス本体にメソッド呼び出しを追加する必要があります( –

+0

)。抽象クラスを使用すると、すべてのモデルがTHATクラスを代わりに拡張する必要があります。 –

関連する問題