在rails_save中获取特定的孩子

时间:2018-08-16 15:14:42

标签: ruby-on-rails

我有两个模型

领导

class Lead < ApplicationRecord
    has_many :calls
end

致电

class Call < ApplicationRecord
    belongs_to :lead
end

在通话控制器上,我需要更新销售线索

def anything
  @call = Call.find(params[:id])

    respond_to do |format|
        if @call.lead.update(lead_params)
            format.html { redirect_to seller_index_path, notice: 'Success' }
            format.json { render :index, status: :ok, location: @call.lead }
        else
            format.html { redirect_to seller_index_path, notice: 'Error' }
            format.json { render json: @call.lead.errors, status: :unprocessable_entity }
        end
    end
end

我可以在Lead模型的after_save中访问特定调用吗?

我需要在调用对象的after_save内部做一些事情

1 个答案:

答案 0 :(得分:1)

这个问题不准确。您要更改来自控制器的呼叫(在此示例中为@call)还是要更改来自该线索的其他呼叫(例如lead.calls.where(...).update_all(...))?

我认为,您的意思是第一个问题,为此,我们将进行以下更改:

#in Lead model:
class Lead < ApplicationRecord
  attr_accessor :specific_call # call it how it suits your business logic
  after_save :do_something_with_specific_call, if: :specific_call # you can use lambda in condition, e.g. if: -> { specific_call.present? }
  # your model code

  protected # or private
    def do_something_with_specific_call
      specific_call.update(...)
    end
end

#in controller method
def anything
  @call = Call.find(params[:id])
  @lead = @call.lead
  @lead.specific_call = @call # link @call to @lead virtual attribute

  respond_to do |format|
    if @lead.update(lead_params) # we can now use @lead
      format.html { redirect_to seller_index_path, notice: 'Success' }
      format.json { render :index, status: :ok, location: @lead } # same here
    else
      format.html { redirect_to seller_index_path, notice: 'Error' }
      format.json { render json: @lead.errors, status: :unprocessable_entity } # same here
    end
  end
end

我们在这里所做的是创建一个getter和setter方法(attr_accessor)。如果设置了模型变量(@lead#specific_call,那么我们将始终运行#do_something_with_specific_call方法,因此我们在控制器方法中设置此变量。

这也称为模型虚拟属性。