0

我有两个表用户(姓名、电子邮件、密码、instance_id 等...)示例:james bond、james@abc.com、1 实例(id、域)示例:1、abc.com

在整个应用程序中,我想确保 James Bond 只看到分配给他的实例 = 1 的数据

因此,如果我有一个带有 (name, desc, instance_id) 的书表,他只会看到他的实例的书。

有人告诉我 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_many Books 通过 Instance

然后,您将有一个额外的旧表将用户映射到他们的实例上的书籍。这是一个 n:m 关系。所以一本书可能属于多个实例。

它看起来像这样:

用户表:

用户(姓名、电子邮件、密码、instance_id 等...)

书表:

Books (name, desc) # no more 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

编辑

如果一本书总是只属于一个实例,你可以试试这个:

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 回答