我的控制器中有一个订阅方法
def subscribe
@subscription = current_user.subscriptions.create(params[:subscription])
@subscription.title = @stream.title
@subscription.save
redirect_to stream_path(@stream)
end
在我将订阅标题设置为流标题之前,如何检查订阅是否已存在且标题相同?
答案 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