2015-04-22 22 views
1

我確定我只是缺少一些簡單的東西,但過去幾天一直在絞盡腦汁。before_save期間的方法錯誤

我有一個預訂和評論表,其中預訂有很多評論。我可以創建「審閱」,但在嘗試定義離開和接收審閱的用戶的角色時會遇到錯誤。

這是我的模特。審查

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和沒有骰子。

我知道這沒有運行,因爲在檢查時,review_receiver_id被留空。

我也能夠通過review.booking.talent_id和review.booking.client_id訪問信息,因此連接在那裏。我知道我必須失去一些東西,但不知道是什麼。

+0

嘗試將'self.update'更改爲'self.update_attributes(review_receiver_id:review_receiver_id)' – MrYoshiji

+0

'review_sender_id'的用途是什麼?它在哪裏定義? – AbM

+0

我使用receiver_id來顯示用戶評分。我以這種方式創建它,因此與單個預訂相關聯的用戶只能留下消息。 – Aguayma

回答

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再次觸發它,方法會再次被調用,並創建無限循環。

+0

謝謝!我知道這是代碼本身,只是不知道在哪裏。我感謝您的幫助!! – Aguayma

+0

如果要在Review類(或任何其他類)的實例內分配ActiveRecord屬性。你必須總是使用'self.attribute ='value''。如果你沒有'self',Ruby就只創建局部變量,'self.attribute'仍然是空白或者具有舊值。 – edariedl