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 に答える