使用 includes 连接 Rails 中的两个模型并使用搜索结果

Using includes to join two models in Rails and using the search results

我是 Rails 的菜鸟。我实际上是一名业务分析师,试图自学代码,这样我就可以在工作中更密切地与开发人员合作。我在从模型中检索字段时遇到问题。

我有两个模式 User 和 CricketClub Adverts,可以在下面看到:

class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable

    mount_uploader :picture, PictureUploader

    #validates_presence_of   :picture
    #validates_integrity_of  :picture
    #validates_processing_of :picture

  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  has_many :cricket_club_advert
  has_many :application
end

class CricketClubAdvert < ActiveRecord::Base
  belongs_to :user, foreign_key: "user_id"
  has_many :application

  mount_uploader :picture, PictureUploader
end

在我的控制器中,我有以下代码:

@adverts = User.includes(:cricket_club_advert)

在我看来我有以下几点:

<% @adverts.each do |advert| %>    
      <!-- Feed Entry -->
      <div class="row">
        <div class="large-2 columns small-3">
        <%= image_tag(advert.picture_url) %>
        </div>
        <div class="large-10 columns">
          <h4> <%= link_to advert.cricket_club_advert.title, cricket_club_advert_path(advert.cricket_club_advert.id) %></h4>
 <%= truncate(strip_tags(advert.cricket_club_advert.description), length: 250) %> 
          <ul class="inline-list">
            <li><a href="">More</a></li>
          </ul>
          </div>
          </div>
          <hr>  

      <!-- End Feed Entry -->
<% end %>

根据文档,我使用了正确的调用,但出现此错误:

undefined method `title' forCricketClubAdvert::ActiveRecord_Associations_CollectionProxy:0x007feca33270c0>

我不知道我做错了什么。

您在这里真正做的是迭代 users 及其 adverts。所以你的变量名很有误导性,应该是:

@users = User.includes(:cricket_club_adverts)

在您看来:

<% @users.each do |user| %>
  # ...
  # ... here the iteration over adverts starts:
  <% user.cricket_club_adverts.each do |advert| %>
    # ...
  <% end %>
  # ...
<% end %>

顺便说一句,请注意复数形式 - 如果您使用 has_many 协会,您应该以复数形式命名您的协会。

Instead of : 
@adverts = User.includes(:cricket_club_advert)
Use :
@adverts = User.includes(:cricket_club_adverts)

因为,一个用户有很多cricket_club_adverts(有-很多关系)

first_advert = @adverts.first
cricket_advert = first_advert.cricket_club_adverts.first 
 #as one user can have many cricket_club_adverts and each 
 #cricket_club_advert will have title, id, description attributes.

hence title, id, description can be fetched by:
cricket_advert.title  #fetch the title
cricket_advert.id  #fetch the id
cricket_advert.description  # fetch the description.