4

私はレールにかなり慣れていないので、実際にauthlogic + acl9を使用するのは初めてです. 両方のプラグインのデフォルトのインストール手順に従いました。

これまでのところ、すべてがうまく機能していますが、この問題のエレガントな解決策を見つけるのに苦労しています:

Products というモデル クラスがあるとします。新しい Product オブジェクトを作成するとき、current_user を所有者として割り当てます。

current_user.has_role! :owner, @product

2 番目のユーザーを登録し、この部分が機能することを確認しました。

products コントローラには index メソッドがあり、単純にすべての製品を返します。

def index
  @products = Products.all
end

私の質問は次のとおりです: current_user が :owner である製品だけを取得するために、Products で find メソッドを呼び出すにはどうすればよいですか? だから私は意味する acl9 インターフェースを使用しています:

@product.accepts_role?(:owner, current_user)

1 つの可能性としては、最初にすべての製品を取得してから、current_user の製品だけで新しい配列を作成することです。だから多分このように:

@products = []
products = Products.all
products.each do |p|
  @products << p if p.accepts_role?(:owner, current_user)
end 

この解決策はかなり無駄に思えます。それで、それを行う正しい方法は何ですか?

みんな、ありがとう!

4

4 に答える 4

1

すべてを1つのクエリで行うのはどうですか:

@products = Product.all.select { |p| p.accepts_role?(:owner, current_user)}

しかし、アイデアはあなた自身が提案したままです

于 2010-01-06T01:43:36.543 に答える
0

なぜ結合したいのかわかりません。acl9 のデフォルト設定に従っている場合は、ユーザーとその役割の間に多対多の関係があり、役割と各承認オブジェクトの間に多対 1 の関係があるはずです。したがって、モデルですべての関係が適切に指定されている場合、次のような単純なものでオブジェクトを取得できるはずです

current_user.roles.find(:first, :conditions => { :name => 'owner' }).products

製品をロールモデルの名前付きスコープまたは関連付けとして具体的に記述する必要がある場合があり、そのファインダーも名前付きスコープにラップすることで、全体をさらに簡素化できます。

于 2009-12-23T21:28:34.263 に答える
0

私は最近、私が取り組んでいたプロジェクトで同じ結論に達しました。

私は、products テーブルに対して role テーブルと role_user テーブルを結合したいと思っていましたが、最終的には上記のアプローチに行き着きました。

現在はうまく機能していますが、うまくスケーリングできません。

于 2009-12-11T05:39:10.433 に答える
0

Productこれらのスコープをモデルに追加します。

scope :roled_by, -> ( r, u ) { where id: u.role_objects.select(:authorizable_id).where( :name => r, :authorizable_type => self ) }
scope :owned_by, -> (u) { roled_by :owner, u }

...そして次のように呼び出します: Product.owned_by current_user- 同じパターンを使用して、他のロール スコープを好きなだけ追加できます (または、必要に応じて呼び出しProduct.roled_by :owner, current_userます)。

ああ、デフォルトの方法を使用していることに注意してrole_objectsください。これを別の方法に設定した場合は (非常に一般的であるため)、スコープで調整します。

于 2015-01-22T22:16:46.650 に答える