我一直在审核rails文档,并且我遇到了尝试访问has_many / belongs_to关系中的数据的问题。我有3个数据模型,如下所示:
class Cuisine < ActiveRecord::Base
has_many :providers
validates :name, presence: true, uniqueness: true
end
class Provider < ActiveRecord::Base
belongs_to :cuisine
has_many :lunches
validates :name, presence: true, uniqueness: true
validates :cuisine, presence: true
end
class Lunch < ActiveRecord::Base
belongs_to :provider
default_scope -> { order('created_at DESC') }
validates :date, presence: true, uniqueness: true
end
我的主要问题是 - 如何显示与提供商相关联的午餐模型中的数据?即 show.html.erb中的provider.lunches.lunchscore ?
有关更多上下文,这是我的providers_controller.rb:
def show
@provider = Provider.find(params[:id])
@lunches = @provider.lunches
@cuisine = @provider.cuisine
end
我正在为提供者视图编辑show.html.erb,我正在寻找显示与提供者相关的数据。
按照railstutorial.org的教程,我包含了一个基于(我相信)一个集合的部分。因此,views / providers / show.html.erb具有以下布局:
<% if @provider.lunches.any? %>
<h3> Total Lunches - (<%= @provider.lunches.count %>) </h3>
<%= render @lunches %>
<br>
<% end %>
@lunches变量(我认为这是一个集合?)然后加载_lunch.html.erb部分,它位于apps / views / lunches / _lunch.html.erb中,具有以下内容:
<ul>
<span class="date-score"><%= number_to_percentage(lunch.lunchscore * 100, precision: 0) %> </span>
<span class="date-list"> <%= link_to lunch.date.strftime("%A %B %e, %G"), lunch_path(lunch.id) %> - <%= link_to @provider.name, lunch_path(lunch.id) %> Likes <%= lunch.liked %> </span>
</ul>
这实际上很有效 - 直到我想加载if语句的 之外的数据(完全在部分之外),并且实际上直接在app / views / providers / show.html中包含它。 ERB。例如,午餐模型具有以下属性:
:date, :liked, :disliked, :enough, :not_enough, :provider_id
我的问题:如果我不想通过if迭代并打印每个值,如何从providers / show.html.erb模型中访问和聚合属性?部分声明?
如果我在提供程序show.html.erb文件中尝试使用包含此内容的基本内容,则会出错:
<%= @provider.lunches.lunchscore.average %>
感谢您的帮助。如果我使用错误的命名法(即数据模型属性或哈希作为集合)我道歉,我只是学习,也是Stack Exchange的新手。随意纠正我。
答案 0 :(得分:4)
您在控制器中设置的变量前缀为@,称为实例变量,可在您的视图中使用。
@provider = Provider.find(params[:id])
会返回单个记录
@lunches = @provider.lunches
会返回ActiveRecord::Relation
当您致电@provider.lunches.lunchscore
时,您正在调用一个要在单个午餐记录上调用的实例方法,但现在您正在处理午餐记录关系。
例如,要选择单个午餐记录,您可以循环午餐
@lunches.each do |lunch|
lunch.lunchscore
end
或者您只能选择关系中的第一条记录
@lunches.first.lunchscore
我希望这能澄清记录和关系之间的区别。