1

我在几个模型中遵循丑陋的 create_unique 方法,例如:

  def self.create_unique(p)
    s = Subscription.find :first, :conditions => ['user_id = ? AND app_id = ?', p[:user_id], p[:app_id]]
    Subscription.create(p) if !s
  end

然后在控制器中#create 动作我有

s = Subscription.create_unique({:user_id => current_user.id, :app_id => app.id})
if s
  raise Exceptions::NotAuthorized unless current_user == s.user
  @app = s.app
  s.destroy
  flash[:notice] = 'You have been unsubscribed from '+@app.name+'.'
  redirect_to '/'
end
4

2 回答 2

1

你试过动态查找器吗?

find_or_initialize_by_user_id_and_app_id
find_or_create_by_user_id_and_app_id
first_or_initialize...
first_or_create....

检查手册http://guides.rubyonrails.org/active_record_querying.html#dynamic-finders

还可以选择为检查唯一值创建验证规则

class Subscription < ActiveRecord::Base
   validates_uniqueness_of :user_id, :scope => :app_id
end

然后

sub = Subscription.new({:user_id => current_user.id, :app_id => app.id})
sub.valid? #false 
于 2012-11-02T15:05:15.123 回答
0

您可以使用validates_uniquness_of :app_id,:scope=>:user_id所以应用 id 是受尊重的 user_id 的唯一

于 2012-11-02T15:07:20.573 回答