如何从连接另一个表的表中显示字段?

时间:2015-10-01 13:01:14

标签: mysql ruby-on-rails ruby

我有一个项目模型,可以通过模型Benefit包含许多产品(反之亦然,产品模型)。在Benefits表格中,project_id和product_id是唯一索引的。

我已经创建了Benefit模型,可以将产品添加到多个项目中,我想通过每个好处添加额外的数据(benefit.title等)。

我能够显示每个项目的产品,但我无法显示任何其他好处。价值。

我的项目模型与这样的好处相关联:

has_many :benefits
has_many :products, through: :benefits

在我的项目视图(show.html.erb)中,我正在显示我的产品字段:

<% @products.each do |product| %>
                    <%= link_to [product.project, product] do %>    
                        <div class="row">
                                <div class="col m3">
                                    <img height="20" src="<%= product.image %>"></img>
                                </div>
                                <div class="col m3">
                                    <%= product.name %>
                                </div>
                                <div class="col m3 truncate">
                                    <%= product.content %>
                                </div>                                  
                                <div class="col m3">
                                    <i class="tiny red-text material-icons right">favorite_border</i>
                                </div>
                        </div>
                    <% end %>
                <% end %>

但它告诉我,当我尝试添加以下内容时,我正在使用未定义的局部变量或方法'Benefit':

<% @products.each do |product| %>
                    <%= link_to [product.project, product] do %>    
                        <div class="row">
                                <div class="col m3">
                                    <img height="20" src="<%= product.image %>"></img>
                                </div>
                                <div class="col m3">
                                    <%= product.name %>
                                </div>
                                <div class="col m3 truncate">
                                    <%= benefit.title %>
                                </div>                                  
                                <div class="col m3">
                                    <i class="tiny red-text material-icons right">favorite_border</i>
                                </div>
                        </div>
                    <% end %>
                <% end %>

关于我应该如何处理的任何想法?

我正在使用Ruby-on-Rails 4.2.0,我是一个新手(你可以清楚地看到);)

我的产品型号的额外代码:

class Product < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: [:slugged, :finders]

belongs_to :project

belongs_to :benefit

has_many :subscriptions
has_many :users, through: :subscriptions

has_many :benefits
has_many :projects, through: :benefits

has_many :reviews

validates :name, presence: true, length: { maximum: 50 }
validates :gtin, presence: true
validates :content, presence: true, length: { maximum: 500 }
validates :video, presence: true
validates :tag, presence: false
validates :project, presence: true

has_attached_file :image, :styles => { :medium => "680x300>", :thumb => "170x75>" }
validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/

def average_rating
    reviews.blank? ? 0 : reviews.average(:star).round(2)
end
end

*更新工作代码:根据此问题中的评论,我能够显示与其连接的任何利益字段的产品列表(已连接到项目)。我错误地创建了一个额外的循环,现在已经解决了。这是我project/show.html.erb中的最终工作代码:

<% @products.each do |product| %>
                <% product.benefits.each do |benefit| %>
                    <%= link_to [product.project, product] do %>    
                        <div class="row">
                                <div class="col m3">
                                    <img height="20" src="<%= product.image %>"></img>
                                </div>
                                <div class="col m3">
                                    <%= product.name %>
                                </div>
                                <div class="col m3 truncate">
                                    <%= product.benefits.first.title %>
                                </div>                                  
                                <div class="col m3">
                                    <i class="tiny red-text material-icons right">favorite_border</i>
                                </div>
                        </div>
                    <% end %>
                <% end %>
            <% end %>

1 个答案:

答案 0 :(得分:2)

<强>更新 在本期中,您必须循环每个福利形式的产品,因为您不能在一个产品中获得许多关联。

您必须使用对象产品来拨打福利。试试这个循环每个好处:

<%= product.benefits.each | benefit| %>
  <div class="col m3 truncate">
    <%= benefit.title %>
  </div>
<% end %>

尝试这样可以获得第一个产品优势:

<%= product.benefits.first.title %>

这是为了获得所有好处加入(,):

<%= product.benefits.map(&:title).join(", ") %>