before_save期间的方法错误

时间:2015-04-22 15:47:57

标签: ruby-on-rails postgresql

我确定我只是遗漏了一些简单的东西,但过去几天一直在绞尽脑汁。

我有一个预订和评论表,其中预订有很多评论。我可以创建Review,但在尝试定义离开和接收审阅的用户的角色时会遇到错误。

这是我的模特。评论

class Review < ActiveRecord::Base
  before_save :define_review_role
  after_create :call_update_rating

  belongs_to :booking

  belongs_to :client, class_name: "User", primary_key: "client_id"
  belongs_to :talent, class_name: "User", primary_key: "talent_id"

  def define_review_role
    if review_sender_id === self.booking.client_id
      review_receiver_id = self.booking.talent_id
    else
      review_receiver_id = self.booking.client_id
    end
    self.update
  end

  def call_update_rating
    user = User.find(self.review_receiver_id)
    if review_receiver_id == self.booking.talent_id
      user.update_talent_rating(self.rating)
    else
      user.update_client_rating(self.rating)
    end
    user.save
  end
end

预订模式

class Booking < ActiveRecord::Base
  # Start Validations
  validates :amount, format: {with: /(\d{1,3})(\.\d{1,2})?/, :message => "field is invalid. Please enter a correct amount."}

  belongs_to :user

  belongs_to :client, class_name: "User", primary_key: "client_id"
  belongs_to :talent, class_name: "User", primary_key: "talent_id"

  has_many :reviews

  has_many :sent_reviews, class_name: "Review", primary_key: "talent_id"
  has_many :received_reviews, class_name: "Review", primary_key: "client_id"

  def client
    User.find(client_id)
  end

  def talent
    User.find(talent_id)
  end
end

我能够很好地创建评论,经过检查,我发现review.review_receiver_id被留空了。由于某种原因,define_review_role没有运行,我尝试过before_create,after_save,after_create和no dice。

我知道这没有运行,因为在检查时,review_receiver_id被留空了。

我也可以通过review.booking.talent_id和review.booking.client_id访问这些信息,因此连接就在那里。我知道我必须遗漏一些但不知道是什么。

1 个答案:

答案 0 :(得分:0)

运行您的方法define_review_role只有编写错误的代码。它应该看起来像这样

def define_review_role
  if review_sender_id === self.booking.client_id
    self.review_receiver_id = self.booking.talent_id
  else
    self.review_receiver_id = self.booking.client_id
  end
end

如果您尝试分配不带self的值,则会将值分配给新创建的本地方法,而不是Report类的属性。

您也无法在此方法结束时调用saveupdate,因为您使用before_save回调来调用它。方法saveupdate再次触发它,方法将再次被调用,并创建无限循环。