【问题标题】:Accessing Rails model information across belongs_to / has_many relationships?跨 belongs_to / has_many 关系访问 Rails 模型信息?
【发布时间】:2015-01-28 03:48:17
【问题描述】:

我一直在查看 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

我的主要问题是 - 如何显示与提供者关联的午餐模型中的数据? IE。 provider.lunches.lunchscore 提供者的 show.html.erb 内?

有关更多上下文,这是我的 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 变量(我认为它是一个集合?)然后加载位于 apps/views/lunches/_lunch.html.erb 中的 _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 中。厄伯。例如,午餐模型具有以下属性:

:date, :liked, :disliked, :enough, :not_enough, :provider_id

我的问题:如果我不想通过 if 语句迭代和打印每个值,我如何从 providers/show.html.erb 模型中访问和聚合属性部分?

如果我尝试在提供程序 show.html.erb 文件中包含这些基本内容,则会出错:

<%= @provider.lunches.lunchscore.average %>

感谢您的帮助。如果我使用了错误的命名法(即数据模型属性或哈希作为集合),我深表歉意,我只是在学习,也是 Stack Exchange 的新手。随时纠正我。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您在控制器中设置的以 @ 开头的变量称为实例变量,并且在您的视图中可用。

    @provider = Provider.find(params[:id]) 返回一条记录

    @lunches = @provider.lunches 返回一个ActiveRecord::Relation

    当您调用 @provider.lunches.lunchscore 时,您正在调用要在单个午餐记录上调用的实例方法,但现在您正在处理午餐记录的关系。

    例如,要选择单个午餐记录,您可以遍历午餐

    @lunches.each do |lunch|
        lunch.lunchscore
    end
    

    或者你只能选择关系中的第一条记录

    @lunches.first.lunchscore
    

    我希望这能阐明记录和关系之间的区别。

    【讨论】:

    • 这澄清了差异,但我将如何访问/添加关系中所有不同的午餐分数?比如:@lunches.each do |lunch| @totallunchscores = totallunchscores + lunch.lunchscore end
    • counter = 0 @lunches.each do |lunch| counter += lunch.lunchscore end
    • 当我使用您的第一个示例 @lunches.each do |lunch| lunch.lunchscore end 它实际上会输出午餐中存储的所有数据 - 日期、喜欢、不喜欢、创建时间等。如果我从循环中删除 .lunchscore ,它具有相同的输出。抱歉回复晚了,感谢您的帮助。
    • @lunches.each doend 需要被 &lt;% %&gt;lunch.lunchscore 包裹 &lt;%= %&gt;
    • 太棒了,这适用于输出所有不同的分数(你的第一个例子),但第二个例子(带计数器)输出连续值 - 我只想要加法的“总和”(我想除以午餐的数量)那么我如何避免将添加的顺序输出发布到页面上?这段代码:&lt;% counter = 0 @lunches.each do |lunch| %&gt; &lt;%= counter += lunch.lunchscore %&gt; &lt;% end %&gt; 输出:0.8125 &lt;snip of numbers&gt; 6.6969994398043395 7.421137370838823 我宁愿它只输出 7.42(并让它除以条目/午餐的数量)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多