【问题标题】:Finding Active Record Associations in Rails Using SQL使用 SQL 在 Rails 中查找活动记录关联
【发布时间】:2016-04-26 03:08:53
【问题描述】:

刚接触 Rails 和 SQL,我正在尝试访问我的应用程序中的关联。

我有一个行程网络应用程序,用户可以在其中下载行程。作为该过程的一部分,他们可以留下评论并附上他们的想法。我希望评论的所有者能够在需要时编辑或删除她的评论,但以下 Active Record 协会正在为@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 资源来了解更多信息?如果没有,有什么更好的方法?

【问题讨论】:

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


    【解决方案1】:

    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 %>
    

    【讨论】:

    • 哇-感谢Shani如此清晰的解释。澄清一下,集合是一个数组,所以你不能从中访问一个特定的 id?如果我做了 itinerary.reviews.first.user_id 怎么办?
    • collection 是一个对象数组。您可以遍历数组以访问单个对象属性。您试图访问数组集合上的 user_id。希望有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多