限制用户在has_one关系中创建一个对象

时间:2014-07-12 12:26:23

标签: ruby-on-rails model restrict

我试图让我的用户不能创建多个服务器场。在我的用户模型中,我有:

 has_one :farm

在我的农场模型中,我有:

belongs_to :user
validate :farm_count_within_limit, :on => :create

def farm_count_within_limit
  if self.user.farms(:reload).size > 1
    errors.add(:base, "User can only add one farm")
  end
end

但是我收到了这个错误:

NoMethodError in FarmsController#create

undefined method `farms' for nil:NilClass

请注意,在此farm_count_within_limit之前,我可以使用我的一个用户创建任意数量的服务器场。有没有更好的方法来限制它,以便用户只能添加一个服务器场?

1 个答案:

答案 0 :(得分:1)

has_one会像这样创建一个单一的farm方法

user = User.find(1)
user.farm

无需在Rails中对此进行额外检查。但是,这不会在数据库级别强制执行,因为不会有具有多个服务器场的用户。防止这种情况的方法主要是创建一个唯一索引。可以在迁移中执行此操作。

add_index :farms, :user_id, unique: true

这将确保数据库中不能有一个具有多个服务器场的用户。