2016-05-16 17 views
2

私は初心者のRubyプログラマーで、Rails APIを使っています。私はLocationモデルとUserモデルを持っていて、場所には多くのユーザーがいます。彼らは、このように関連していますbefore destroy destroy back

class Location << ActiveRecord::Base 
    has_many: :users 
end 

class User << ActiveRecord::Base 
    belongs_to :location 
end 

が、私はそれが1人のまたは複数の関連するユーザーがいる場合は場所のモデルオブジェクトが破壊されないように場所モデルに制約を載せていきたいと思います。

ムンバイの場合を考えてみましょう。ムンバイはロケーションであり、1人以上のユーザーがいます。したがって、私はその場所を破壊することはできません。特定の場所にユーザーがいない場合にのみ破壊することができます。

このような保護された方法でレコードを破棄する方法をどのように処理するのですか?

+0

class Location << ActiveRecord::Base has_many: :users before_destroy :check_for_users def check_for_users return if users.any? errors[:base] << "some error message" false end end 

は、その後、あなたもあなたのコントローラにエラーメッセージにアクセスすることができますlocation.users.present?削除を制限します。 –

答えて

1

あなたの場所のモデルは、このように見えるように更新することができます。

class Location << ActiveRecord::Base 
    before_destroy :confirm_safe_to_destroy 

    has_many: :users 

private 

    def confirm_safe_to_destroy 
    return false if users.any? 
    end 
end 

これは、before_destroyハンドラを使用して、Location modを破壊するのが安全かどうかを確認しますエルオブジェクト。 confirm_safe_to_destroyメソッドは、場所に関連付けられているユーザーがいる場合、破棄プロセスを停止するためにfalseを返します。

+0

ありがとう。出来た。 :) – Abhishek

1

ちょうどあなたのモデルにこのようなものを追加します。あなたの場所のモデルで

# in app/models/location.rb 
before_destroy :ensure_no_users 

private 
def ensure_no_users 
    return false if users.any? 
end 
1

は、次の行を追加します。

before_destroy :check_for_users #This will be run before destroy is called. 



def check_for_users 
    return false if self.users.present? 
end 
+0

ありがとうございました。それは働いた! :) – Abhishek

1

また、インスタンスにエラーメッセージを追加することができます:あなたが破壊するアクション場合にチェックを入れることができます

if @location.destroy? 
    # success flow - location was deleted 
else 
    @location.errors.full_messages #=> "some error message" 
end 
+0

ありがとうございます。出来た。 :) – Abhishek