使用 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.
我是 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.