使用SQL

时间:2016-04-26 03:08:53

标签: sql ruby-on-rails sql-server

Rails和SQL的新手,我尝试访问我的应用中的关联。

我有一个行程网络应用程序,用户可以来这里下载行程。作为流程的一部分,他们可以将评论留给他们的想法。如果需要,我希望评论的所有者能够在思考之后编辑或删除她的评论,但是以下的Active Record Association正在为@ 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可以工作但不能运行.reviews.reviews.user_id
  2. 什么SQL命令可以实现我想要的东西?
  3. 如果我可以使用SQL,我可以选择哪些SQL资源来了解更多信息?如果没有,最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

Review.first将返回您的审核对象,并且您正在Review.first.user_id

访问与之关联的user_id

itinerary.reviews

返回属于特定行程的所有评论的集合,它是活动记录对象的集合,并且您尝试从活动记录集合中访问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 %>