0

我试图阻止我的用户与不属于他们的记录在“多次通过”关联中创建关系。

我的用户通过 location_users 有很多位置。他们的位置通过location_shops有很多商店。我目前用 CanCan 保护了一些东西。

class User < ActiveRecord::Base
  has_many :locationusers
  has_many :locations, :through => :locationusers  
end

class Location < ActiveRecord::Base
  has_many :locationusers
  has_many :users, :through => :locationusers
  has_many :location_shops
  has_many :shops, :through => :location_shops
end

class Shop < ActiveRecord::Base
  has_many :location_shops
  has_many :locations, :through => :location_shops
end

还有我的康康舞能力

class Ability
  can [:manage], Shop, { :locationusers => {:user_id => user.id }}
  can [:manage], Location, { :locationusers => {:user_id => user.id }}
end

我可以通过此设置处理位置的创建/编辑,而我的用户只能查看/编辑他们自己的位置/商店。

问题是这些关系的建立。

如果用户发布了不属于他们的位置 ID,则无论他们是否有权创建关系,都会创建关系。当然,他们无法查看这种关系,但我需要首先阻止创建。

例如,具有 ID 314 的单个位置的用户

>> User.last.locations.map(&:id)
=> [314]

创建新商店时,如果我更改发布的参数:

:shop=>{:shop_name=>"Ye Old Shoppe", :location_ids => [1,2,3,314]}}

以上显然为四个位置创建了关系。我需要它在创建关系之前验证位置 ID。

我唯一能想到的就是在模型中添加 before_add :

class Location
  has_many :location_shops
  has_many :shops, :through => :location_shops, :before_add => :check_location_ownership
end

这是正确的方法吗?如果是这样, :check_location_ownership 应该是什么样子?或者,有没有更好的方法来阻止建立关系?

4

1 回答 1

1

尽管您所做的确实有意义,但我还可以想到另外两种方法。

1)在关系上使用:conditions选项。has_many

2) 自定义验证方法。

class Location
  has_many :location_shops
  has_many :shops, :through => :location_shops
  validate :check_location_ownership
end

我个人会根据情况选择这三个中的一个。

于 2013-03-25T10:39:47.593 回答