我有两个桌子用户(名称,电子邮件,密码,instance_id等...)示例:詹姆斯·邦德,james@abc.com,1个实例(id,域)示例:1,abc.com

通过申请,我要确保James Bond仅看到分配给他的实例= 1的数据

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

有人告诉我,坎卡(Cancan)是这样做的方法级别低于上述数据规则。

想法?

有帮助吗?

解决方案

您可以尝试使用示波器,例如:

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图书通过实例

然后,您将有一个额外的旧表映射用户来通过其实例进行书籍。这是一个N:M的关系。因此,一本书可能属于多个实例。

看起来像这样:

用户表:

用户(名称,电子邮件,密码,实例_ID等...)

书籍表:

书籍(名称,desc)#NO MORE INSPENS_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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top