跨belongs_to / has_many关系访问Rails模型信息?

时间:2015-01-28 03:48:17

标签: 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

我的主要问题是 - 如何显示与提供商相关联的午餐模型中的数据?即 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的新手。随意纠正我。

1 个答案:

答案 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

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