1

我有两个模型UserItem它们与has_many through关联有关。我想创建没有项目的用户,但项目创建应该验证至少一个用户的存在。我通过以下方式创建项目:

@user.items.create!(name: "Ball")

在创建项目之前,我可以做些什么来创建用户存在的有效验证?

我尝试了以下方法:

  • 模型validate :users, presence: true中的Item
  • 模型validate :item_users, presence: true中的Item
  • 连接模型validate :user, :item, presence: true中的aItemUser
  • avalidate :should_have_at_least_one_userItem模型中具有一个私有函数error.add(:base, 'select at least one user') if self.users.count < 1

这些方法都没有奏效。我认为问题是某种竞争条件,因为当我按照以下方式创建项目时,一些验证确实有效。

@item.new(name: "Ball")
@item.users << @user
@item.save

有任何想法吗?

4

1 回答 1

0

使用回调

在您的项目控制器中:

before_save :user_for_item_exists?


private
def user_for_item_exists?
  return nil if @item.users == nil
  return @item      
end

第二个返回有点冗长,你可以省略它。然后,您要么拥有要保存的 @item,要么拥有 nil。您可以确保在您的模型中没有保存 nil。

于 2013-11-17T10:43:25.093 回答