2016-04-26 79 views
0

Rails和SQL的新手和我試圖訪問我的應用中的關聯。使用SQL在Rails中查找活動記錄關聯

我有一個行程網絡應用程序,用戶可以下載並下載行程。作爲這個過程的一部分,他們可以用他們的想法留下評論。我要檢討的所有者能夠編輯或思想後刪除她的回顧如果需要的話,但下面的活動記錄協會的返回@ itinerary.reviews.user_id錯誤:

undefined method `user_id' for #<Review::ActiveRecord_Associations_CollectionProxy:0x007fb969392978> 

裏面我itineraries_helper:

def user_is_reviewer? 
    @itinerary = Itinerary.find(params[:id]) 
    !!current_user.id == @itinerary.reviews.user_id 
end 

筆者認爲:

<div class = "review-container"> 
    <h2>What Travelers Thought</h2> 
    <% if @itinerary.reviews.count > 0 %> 
    <% @itinerary.reviews.each do |review| %> 
    <div class = "reviews"> 

     <div class = "star-rating" data-score= <%= review.rating %> ></div> 
     <p> 
     <%= review.comment %> 
     </p> 
     <% if user_is_reviewer? %> 
     <% link_to "Edit", edit_itinerary_review_path(@itinerary, @review) %> 
     <% end %> 

    <% end %> 
    </div> 

問題:

  1. 爲什麼Review.first.user_id工作,但不是itineraries.reviews.user_id
  2. 什麼SQL命令將實現我在找什麼?
  3. 如果我可以使用SQL,可以學習更多的SQL資源嗎?如果不是,最好的方法是什麼?

回答

0

Review.first將返回您的評論的對象,你是通過Review.first.user_id

itinerary.reviews 

訪問與之相關聯的USER_ID將返回所有評論的集合,屬於特定行程它是活動記錄對象的集合,並且您試圖從活動記錄集合中訪問不起作用的user_id。

你可以通過審查ID到您的輔助方法,

def user_is_reviewer?(review_id) 
    review = Review.find(review_id) 
!!current_user.id == review.user_id 
end 

在您的視圖更新輔助方法有審查ID解決它通過

<% if user_is_reviewer?(review) %> 
    <% link_to "Edit", edit_itinerary_review_path(@itinerary, @review) %> 
<% end %> 

否則,你可以簡單地去無助手方法,因爲你已經有一個審查對象,如下圖在你的看法

<% if current_user.id == review.user_id %> 
    <% link_to "Edit", edit_itinerary_review_path(@itinerary, @review) %> 
<% end %> 
+0

哇 - 謝謝你這樣的清晰的解釋沙尼。爲了澄清,集合是一個數組,所以你不能從它訪問一個特定的ID?如果我做了itinerary.reviews.first.user_id怎麼辦? – morales257

+0

集合是一個對象數組。你可以遍歷數組來訪問單個的對象屬性。您正嘗試訪問數組集合上的user_id。希望有所幫助 – Shani