0

2 つのテーブルがあります ユーザー (名前、電子メール、パスワード、instance_id など) 例: james bond、james@abc.com、1 インスタンス (id、ドメイン) 例: 1、abc.com

アプリケーション全体を通して、ジェームズ・ボンドが自分のインスタンスに割り当てられたデータのみを確認できるようにしたい = 1

したがって、(name, desc, instance_id) を含む book テーブルがある場合、彼は自分のインスタンスの本しか見ることができません。

CanCanがこれを行う方法であると言われていますが、上記のように何かをグローバルに設定する方法がわかりません。管理者、モデレーターなどの役割に基づいているようです...必要になりますが、上記のデータルールよりも低いレベル。

考え?

4

1 に答える 1

3

次のようなスコープを使用してみることができます。

class Books < ActiveRecord::Base
# .... code ....
scope :personal, proc {|user| where(:instance_id => user.instance_id) }
# .... code ...
end

今、あなたはすることができます:

@personal_books = Books.personal(@user)

スコープの詳細については、 http ://www.railsdispatch.com/posts/rails-3-makes-life-better (少し下にスクロール)を参照してください。

別の方法は、次のような関連付けを行うことです

インスタンスを介したユーザーhas_manyBooks

次に、ユーザーをインスタンス上の本にマッピングする追加のレガシーテーブルがあります。これはn:mの関係です。したがって、本は複数のインスタンスに属する可能性があります。

次のようになります。

ユーザーテーブル:

ユーザー(名前、電子メール、パスワード、instance_idなど...)

ブックテーブル:

Books(name、desc)#これ以上instance_idはありません!

マッピングテーブル:

割り当て(instance_id、book_id)

そして、モデルは次のようになります。

class Assignment < ActiveRecord::Base
  belongs_to :book      # foreign key - book_id
  belongs_to :instance  # foreign key - instance_id
end

class Instance < ActiveRecord::Base
  has_many :assignments
  has_many :books, :through => :assignments
end

class Books < ActiveRecord::Base
  has_many :assignments
  has_many :users, :through => :assignments
end

class User < ActiveRecord::Base
  belongs_to :instance
end

ユーザーのインスタンスのすべての本を取得するコードは次のようになります。

@user       = User.find(:first)
@books      = @user.instance.books.find(:all)

( http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.htmlを読むことをお勧めします)

編集

本が常に1つのインスタンスにのみ属している場合は、これを試すことができます。

class User < ActiveRecord::Base
  belongs_to :instance
end


class Instance < ActiveRecord::Base
  has_many :users
  has_many :books
end


class Books < ActiveRecord::Base
  belongs_to :instance
end

したがって、次のようなユーザーの本を入手します。

@user.instance.books.find(:all)
于 2010-09-07T18:21:34.320 に答える