如何将注释表连接到另一个表?

时间:2015-04-03 16:43:47

标签: ruby-on-rails

一个非常基本的RoR问题,我似乎无法在网上找到答案:

我有两个用脚手架创建的独立表。 午餐和评论。在脚手架期间没有建立关系。如果需要,我可以重做评论脚手架。

我需要能够接收并在午餐索引视图中向每个午餐显示相关评论。有人可以告诉我该怎么做吗?

我将models \ comment.rb编辑为:

class Comment < ActiveRecord::Base
    belongs_to :lunch
end

我将models \ lunch.rb编辑为:

class Lunch < ActiveRecord::Base
    has_many :comments, dependent: :destroy
end

在午餐视图中,我有一个列出所有午餐列的循环:

<tbody>
    <% @lunches.each do |lunch| %>
      <tr class="<%= cycle('list_line_odd', 'list_line_even')%>">

          <td><%= lunch.company %></td>
          <td><%= lunch.person %></td>
          <td><%= lunch.email_submit_lunch %></td>
          <td><%= lunch.company_contact %></td>
          <td class="list_description"><%= truncate(strip_tags(lunch.description), length: 40) %></td>
          <td><%= lunch.date %></td>
          <td><%= lunch.price %></td>

          <td class="list_actions"><%= link_to 'Show', lunch %></td>
          <td class="list_actions"><%= link_to 'Edit', edit_lunch_path(lunch), data: { confirm: 'Are you sure?' } %></td>
          <td class="list_actions"><%= link_to 'Destroy', lunch, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>

**编辑:我已重做评论表以包含lunch_id外键。如何将这个外键(lunch_id)从午餐视图传递到评论创建过程?

4 个答案:

答案 0 :(得分:0)

您应该在午餐模型上使用评论关系。

如果你正确地建立了它,那么你可以尝试类似的东西:

<tbody>
<% @lunches.each do |lunch| %>
  <tr class="<%= cycle('list_line_odd', 'list_line_even')%>">

      <td><%= lunch.company %></td>
      <td><%= lunch.person %></td>
      <td><%= lunch.email_submit_lunch %></td>
      <td><%= lunch.company_contact %></td>
      <td class="list_description"><%= truncate(strip_tags(lunch.description), length: 40) %></td>
      <td><%= lunch.date %></td>
      <td><%= lunch.price %></td>

      <td>
        <%- lunch.comments.each do |comment| %>
          <p><%= comment.body %></p>
        <% end %>
      </td>

      <td class="list_actions"><%= link_to 'Show', lunch %></td>
      <td class="list_actions"><%= link_to 'Edit', edit_lunch_path(lunch), data: { confirm: 'Are you sure?' } %></td>
      <td class="list_actions"><%= link_to 'Destroy', lunch, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>

UPD:

class CommentsController < ApplicationController
  def create
    lunch = Lunch.find(params[:lunch_id])
    lunch.comments.create!(comment_params)
  end

  private

  def comment_params
    params[:comment].permit(:body)
  end
end

在这种情况下,当您发布表单以创建评论时,您应该添加lunch_id以形成参数,例如:

lunch_path(lunch_id:lunch.id)

这是主要的想法。但实现可能取决于您的业务逻辑。例如,您在哪里找到新的评论表和其他条件。

答案 1 :(得分:0)

您在说明中没有提到它,但是您需要将列lunch_id添加到评论表(如果您还没有),以使关系正常工作。

通过定义Lunch has_many :comments Rails将为Lunch创建一个名为comments的实例方法,该方法将返回相关的注释。

在您的视图中,您可以执行以下操作来显示评论。

<tbody>
<% @lunches.each do |lunch| %>
  <tr class="<%= cycle('list_line_odd', 'list_line_even')%>">
      <td><%= lunch.company %></td>
      <td><%= lunch.person %></td>
      <td><%= lunch.email_submit_lunch %></td>
      <td><%= lunch.company_contact %></td>
      <td class="list_description"><%= truncate(strip_tags(lunch.description), length: 40) %></td>
      <td><%= lunch.date %></td>
      <td><%= lunch.price %></td>

      <ul>          
        <% lunch.comments.each do |comment| %>
          <li><%= comment %></li>
        <% end %>
      </ul>

      <td class="list_actions"><%= link_to 'Show', lunch %></td>
      <td class="list_actions"><%= link_to 'Edit', edit_lunch_path(lunch), data: { confirm: 'Are you sure?' } %></td>
      <td class="list_actions"><%= link_to 'Destroy', lunch, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>
</tbody>

答案 2 :(得分:0)

您肯定需要在评论表中为午餐建立FK。调整迁移以包括:

create_table "comments" do |t|
  t.string   :body
  t.integer  :lunch_id
end

然后要显示评论,只需循环浏览索引视图中每个comments上的lunch

<td>
  <% lunch.comments.each do |comment| %>
    <p><%= comment.body %></p>
  <% end %>
</td>

答案 3 :(得分:0)

据我所知,您独立创建了两个模型支架。这意味着您的数据库表未连接。

要实际建立关联,您必须在评论表中添加一列&#34; lunch_id&#34; (这会告诉Rails评论所属的午餐)。

您可以通过运行

来完成此操作
rails g migration AddLunchIdToComment

之后打开新创建的迁移文件并添加行

add_column, :comments, :lunch_id, :integer

更改功能内部。

之后执行rake db:migrate

现在,您可以在视图循环中使用lunch.comments方法访问与午餐相关的评论。这应该使你的代码工作(不要忘记重启服务器)。