ruby-on-rails - 跨 belongs_to/has_many 关系访问 Rails 模型信息?

标签 ruby-on-rails

我一直在查看 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。提供者的 show.html.erb 中的 provider.lunches.lunchscore?

有关更多上下文,这是我的 providers_controller.rb:
  def show
    @provider = Provider.find(params[:id])
    @lunches = @provider.lunches
    @cuisine = @provider.cuisine
  end

我正在为提供者 View 编辑 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.erb 中。例如,午餐模型具有以下属性:
:date, :liked, :disliked, :enough, :not_enough, :provider_id

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

如果我尝试一些基本的东西,比如在提供程序 show.html.erb 文件中包含这个,我会出错:
<%= @provider.lunches.lunchscore.average %>

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

最佳答案

您在 Controller 中设置的以@ 开头的变量称为实例变量,并且在您的 View 中可用。
@provider = Provider.find(params[:id])返回单个记录
@lunches = @provider.lunches返回 ActiveRecord::Relation

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

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

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

或者您只能选择关系中的第一条记录
@lunches.first.lunchscore

我希望这可以澄清记录和关系之间的区别。

关于ruby-on-rails - 跨 belongs_to/has_many 关系访问 Rails 模型信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28184305/

相关文章:

javascript - 使用主过滤器 "with multi"和辅助过滤器 "only one"过滤列表结果

ruby-on-rails - 将整数值列转换为字符串表示的最佳实践

ruby-on-rails - 如何在 Ruby on Rails 中内联编写条件三元运算符?

ruby-on-rails - 在 Ruby 字符串中查找和替换变量

mysql - ActiveRecord 关联 : am I doing it right?

javascript - 如何通过 jquery 更改输入名称的一部分?

ruby-on-rails - Ruby/Rails 将字符串转换为类属性

mysql - Rails - 如何从外部数据库访问表

ruby-on-rails - Action 缓存未正确过期,即使我可以看到它正在被调用

ruby-on-rails - 为什么有不同的 Ruby On Rails 版本?