在创建之前检查记录是否存在

时间:2014-05-30 14:56:39

标签: ruby-on-rails postgresql if-statement controller

我的控制器中有一个订阅方法

  def subscribe

    @subscription = current_user.subscriptions.create(params[:subscription])
    @subscription.title = @stream.title
    @subscription.save

    redirect_to stream_path(@stream)

  end

在我将订阅标题设置为流标题之前,如何检查订阅是否已存在且标题相同?

2 个答案:

答案 0 :(得分:0)

像这样:

current_user.subscriptions.where(title: @stream.title).present?

但假设您只想保存未包含在其他地方,您可以这样做:

if current_user.subscriptions.where(title: @stream.title).blank?
  @subscription.title = @stream.title
  @subscription.save
end

执行此操作的一种优雅方法是将逻辑添加到控制器,以便验证唯一性(并且还可以防止竞争条件):

class Subscription < ActiveRecord::Base
   validates_uniqueness_of :title, scope: :user
end

然后你可以在model.save中检查验证(再次假设你不希望它保存,如果它共享相同的标题)

答案 1 :(得分:0)

为了帮助您,@Sergio Tulentsev的建议基本上意味着您在数据库中的列上创建唯一索引,如下所示:

#db/migrate/[timestamp]_new_migration.rb
add_index :table, :column, unique: true

这会创建一个index on your data table,这基本上意味着您不能在其中创建任何重复数据。底线 - 这意味着您只能插入一次数据。

-

save!方法用于更新您的记录(如果已存在)。我第一次看到这种方法,所以对我来说这是一个很好的教训。如果您遇到问题,可能是您的数据库不具备您需要的index