我有一个User
可以有很多Restaurants
。我也可以有多个用户。
我想拥有它,以便如果用户 A创建Restaurant A,他不应该能够创建另一家同名的餐厅。
但是,如果用户 B去创建餐厅 A ,那应该是允许的,但之后仍然不能创建另一个 餐厅 A。
我有以下has_many through
关系:
餐厅.rb
has_many :ownerships
has_many :users, :through => :ownerships
# This following ensures uniqueness of the name within the
# Restaurants table regardless of who the User is that created it.
validates :name, presence: true, uniqueness: true
用户.rb
has_many :ownerships
has_many :restaurants, :through => :ownerships
所有权.rb
belongs_to :restaurant
belongs_to :user
我试过的
1. 添加 :uniqu => true
我尝试将 :uniq => true 添加到 restaurant.rb 文件,所以它看起来像这样:
has_many :ownerships
has_many :users, :through => :ownerships, :uniq => true
并uniqueness: true
从验证中删除,所以它看起来像这样:
validates :name, presence: true
但这没有任何用处。
2.在ownership.rb中添加验证
我尝试将验证添加到ownership.rb
文件中:
validates :restaurant, uniqueness: {:scope => :user}
但我得到:
NoMethodError in RestaurantsController#create
undefined method `text?' for nil:NilClass
而且我似乎无法告诉它在此验证中查找用户范围内的餐厅名称。
3. 创建 before_create 回调函数
在我的restaurant.rb
文件中,我声明了以下内容:
before_create :check_uniqueness
def check_uniqueness?
user = User.find_by_id(self.user_ids)
isUnique = false
user.restaurants.each do |restaurant|
if !Restaurant.find_by_name(self.name).nil? # Restaurant w/ same now found
isUnique = false
else
isUnique = true
end
return isUnique
end
end
我的假设是,在创建餐厅记录之前,它会进行此check_uniqueness
检查,如果函数返回 false,则不会保存。
但是当我点击提交按钮时出现以下错误:
NameError in RestaurantsController#create
undefined local variable or method `check_uniqueness' for #<Restaurant:0x007f95a16d10f8>
工作解决方案
感谢Robert Chuchro 在下面的帮助,我能够进行验证。这是我所做的:
餐厅.rb
before_create :unique_per_user?
def unique_per_user?
user = User.find_by_id(self.user_ids)
restaurant = user.restaurants.find(:all, :conditions => ["name = ?", self.name])
if restaurant.size > 0
self.errors.add(:name, ": You've already created a restaurant with this name.")
end
return (restaurant.size <= 0)
end