试图迭代关联的模型,CollectionProxy总是有一个零条目

时间:2014-01-05 04:07:25

标签: ruby-on-rails ruby-on-rails-4

我的主要模型Activity有适当的数据。

>> @activity
=> #<Activity id: 4, name: "Take a nap", description: "Let your kids sleep when they're tired", location: "home", duration_minutes: 60, created_at: "2014-01-01 20:32:56", updated_at: "2014-01-01 20:32:56">

关联的模型,Review,返回一个基本为零的CollectionProxy。因此,当我尝试迭代@activity.reviews.each时,会导致我出现问题,因为它总是有一个将迭代的零CollectionProxy。

>> @activity.reviews
=> #<ActiveRecord::Associations::CollectionProxy [#<Review id: nil, rating: nil, reviewer_name: nil, activity_id: 4, description: nil, created_at: nil, updated_at: nil>]>
>> @activity.reviews.any?
=> true
>> @activity.reviews.count
=> 0

如果我在那里放了一些数据,我会得到我添加的真实数据,但我仍然会得到这个nil集合代理小丑。

>> @reviews
=> #<ActiveRecord::Associations::CollectionProxy [#<Review id: 5, rating: 5, reviewer_name: "Peter", activity_id: 4, description: "I can be productive when the kids are sleeping.", created_at: "2014-01-05 03:53:08", updated_at: "2014-01-05 03:53:08">, #<Review id: nil, rating: nil, reviewer_name: nil, activity_id: 4, description: nil, created_at: nil, updated_at: nil>]>
>> @reviews.any?
=> true
>> @reviews.count
=> 1

所以,我的问题是,我的关联有什么问题,我不断收到这个无用的nil CollectionProxy条目?

另外,我刚刚查看了postgres控制台,没有损坏的记录,关联(activity_id = 4)但没有数据。

在幕后:

/models/activity.rb

class Activity < ActiveRecord::Base
  has_many :reviews
end

/models/review.rb

class Review < ActiveRecord::Base
  belongs_to :activity
end

2 个答案:

答案 0 :(得分:1)

CollectionProxy对象不是 nil,正如您所说。 @activity实际上有一个 Review - 问题是Review的{​​{1}} id。不确定这是怎么发生的,但你可以从Rails控制台纠正这个问题:

nil

答案 1 :(得分:0)

执行@ activity.reviews的时间点是在form_for之后的显示页面上。看起来form_for创建了一个新的activity.review。它当时并没有得到保存/创建。所以,它只是创建了垃圾,它给了我基本上为零的CollectionProxy,但是它具有当前活动的activity_id。

<h2>Add a review</h2>
<%= form_for([@activity, @activity.reviews.build]) do |f| %>
    <div class="field">
        <%= f.label :rating %><br>
        <%= f.number_field :rating %>
    </div>
    <div class="field">
        <%= f.label :reviewer_name %><br>
        <%= f.text_field :reviewer_name %>
    </div>
    <div class="field">
        <%= f.label :description %><br>
        <%= f.text_area :description %>
    </div>
    <div class="actions">
        <%= f.submit %>
    </div>
<% end %>


<h2>Reviews</h2>
<% @reviews.each do |review| %>
    <p><%= "#{review.reviewer_name} - #{review.rating} - #{review.description}"%></p>
<% end %>

为zeantsoi和BroiSatse干杯,帮助我走上正确的道路来解决这个问题。

我的选择是在Add-A-Review之前移动评论,或者添加一些进一步的nil-checking。