私が次のことをした場合:
@user.name = "John"
@user.url = "www.john.com"
@user.save
使用する場合after_save
@user.url = "www.johnseena.com"
@user.save
これを行うとどうなりますか?
'after_save'コールバックがあるため、値を保存する必要があると思います。
私が次のことをした場合:
@user.name = "John"
@user.url = "www.john.com"
@user.save
使用する場合after_save
@user.url = "www.johnseena.com"
@user.save
これを行うとどうなりますか?
'after_save'コールバックがあるため、値を保存する必要があると思います。
私の意見でsave
は、コールバックで関数を呼び出すafter_save
と、最初にガードを付けない限り、再帰にトラップされます。このような
class User < AR::Base
after_save :change_url
def change_url
#Check some condition to skip saving
url = "www.johnseena.com"
save #<======= this save will fire the after_save again
end
end
ただし、ガードを付ける以外に、使用することupdate_column
もできます
def change_url
update_column(:url, "www.johnseena.com")
end
この場合、発火しませんafter_save
。ただし、発火しafter_update
ます。したがって、そのコールバックで更新操作がある場合は、再び再帰的になります:)
after_saveコールバックは、そのオブジェクトの保存または更新に関係なくトリガーされます。
また、
update_columnは、コールバック(つまり、after_update)をトリガーせず、検証もスキップします。http://apidock.com/rails/ActiveRecord/Persistence/update_columnを参照してください
Uは、操作とそのタイミングに応じて、特にafter_createまたはafter_updateを使用する必要があります。
after_create :send_mail
def send_x_mail
#some mail that user has been created
end
after_update :send_y_mail
def send_y_mail
#some data has been updated
end
after_save :update_some_date
def update_some_data
...
action which doesnt update the current object else will trigger the call_back
end
また、`after_create`と`after_save`の違いは何ですか?また、どちらをいつ使用するかを参照してください。コールバックについては、http://ar.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M000059を参照してください。
何かを変更しても、すでに行われafter_save
ているため、保存されません。save
介入する唯一のチャンスは、トランザクション全体をロールバックすることです。save
に別のものを追加after_save
すると、無限ループになります。
データベースに対して2つのクエリを実行して再帰を心配する代わりに、サーバーに送信する前にデータペイロードを変更することを検討することをお勧めします。
class User < AR::Base
before_save :change_url
def change_url
url = "www.johnseena.com"
end
end
ここで私を助けてくれたすべての人に感謝します。これが私の問題を解決した解決策です。注文モデルによって次のように変更しました。
class Order < ActiveRecord::Base
has_and_belongs_to_many :users
validates :item, presence: true
def add_order(username, order)
user = User.where(username: username).first
if !user.nil?
user.orders.create(item: order.item)
end
end
def remove_order(order)
end
end