防止Rails中的重复关联记录

时间:2013-03-24 02:15:31

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord associations

我正在开发一个简单的应用程序,我有两个模型:

class Report < ActiveRecord::Base
  attr_accessible :comments, :user_attributes

  belongs_to :user

  accepts_nested_attributes_for :user
end 

class User < ActiveRecord::Base
  attr_accessible :username

  has_many :reports
end 

我也有这个HAML新报告视图:

= form_for @report do |f|
  .field
    = f.fields_for :user do |u|
      = u.label :username
      = u.text_field :username
  .field
    = f.label :comments
    = f.text_area :comments

  .action
   = f.submit "Submit report"

表单发送此JSON参数:

{ user_attributes => { :username => "superuser" }, :comments => "Sample comment 1." }

简单的报告控制器处理记录报告和用户的创建。

def create
  @report = Report.new(params[:report])
  @report.save
end

这可以同时成功创建报告和用户。如果我使用相同的用户名(超级用户)提交另一个报告,我需要做的是阻止创建另一个用户。在Rails模型或控制器中有一种简单的方法吗?谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用reject_if选项拒绝用户创建

accepts_nested_attributes_for :user, reject_if: Proc.new { |attributes| User.where(username: attributes['username']).first.present? }

我会将其重构为:

accepts_nested_attributes_for :user, reject_if: :user_already_exists?

def user_already_exists?(attributes)
  User.where(username: attributes['username']).first.present?
end