简体   繁体   中英

undefined method `concert_id' for #<FollowUp::ActiveRecord_Associations_CollectionProxy:0x00007f8d481b3dc0> Did you mean? concat

I have a model of follow_ups and volunteers as:

class FollowUp < ApplicationRecord
  belongs_to :volunteer
  belongs_to :member
  belongs_to :concert
end

class Volunteer < ApplicationRecord
  enum type: [:admin, :regular]
  has_many :follow_ups, dependent: :delete_all
  has_many  :members, through:  :follow_ups
end

Now I wanted to print follow_ups by all volunteers. It was working fine when I tried in rails console ie Volunteer.first.follow_ups I want to show those value in the form, what I tried is:

Volunteer.all.each do |volunteer|
 volunteer.follow_ups.concert_id
end

The has_many relation denotes a one-to-many association. Instead of returning a single object, it returns a collection of follow_ups .

That said, you can't do volunteer.follow_ups.concert_id , because follow_ups is an Active Record collection. Make an iteration instead:

volunteer.follow_ups.each { |follow_up| puts follow_up.concert_id }

The Ruby on Rails documentation has great content about Active Record Associations.

To collect such information you should use:

volunteer.follow_ups.pluck(:concert_id)

Edit:

It's very important to note that using pluck is more efficient than using iterators like map and each due to saving server RAM and request time. Then you can print to rails logger:

volunteer.follow_ups.pluck(:concert_id).each{|ci| Rails.logger.info ci}

Edit2

Referring to your text

I want to show those value in the form

If I understand you, you want to show concert_id of each follow_up in the volunteer form. in this case you should add

accepts_nested_attributes_for :follow_ups in your volunteer.rb then:

<%= form_for @volunteer do |f| %> 
   <%= f.fields_for :follow_ups do |form_builder| %>
      <%= label_tag "custom_label", "follow up id : #{form_builder.object.id}, concert_id : #{form_builder.object.concert_id}%>
   <% end %>
<% end %>

The fields_for helper will iterate through all follow_ups , then you can get the object for each follow_up using object which allow you to deal with object directly and get your concert_id attribute from it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM