【问题标题】:Rails - Returning list of incorrect idsRails - 返回错误 ID 的列表
【发布时间】:2015-03-14 12:09:25
【问题描述】:

我有一个包含 Dog、Events 和 Booking 模型的应用。每个活动都有很多预订,每只狗都有很多预订,但每个预订都属于一个活动并且有一只狗。

在“事件”视图中,它应该列出具有该 ID 的所有预订以及关联狗的详细信息。

我在“Rails Error: undefined method `' for nil:NilClass”时遇到了很多麻烦,但后来意识到问题在于它是根据预订 ID 而不是 dog_id 字段检索狗的列表。

在控制台中,我可以看到这是正在生成的 SQL 查询,我认为是错误的根源,但我不知道为什么:

SELECT "dogs".* FROM "dogs" INNER JOIN "bookings" ON "dogs"."id" = "bookings"."id" WHERE "bookings"."event_id" = ?  [["event_id", 1]]

我花了几天时间梳理 Stack Overflow 和 Google,找出我哪里出了问题,但有点迷茫。以下是模型:

class Event < ActiveRecord::Base
has_many :bookings
has_many :dogs, :through => :bookings, :foreign_key => "dog_id"
end

class Dog < ActiveRecord::Base
validates :name, presence: true, length: { maximum: 255 }
validates :breed, presence: true, length: { maximum: 255 }
belongs_to :owner
validates :owner_id, presence: true
has_many :bookings
has_many :events, through: :bookings, :foreign_key => "event_id"
end

class Booking < ActiveRecord::Base
belongs_to :event
has_one :dog, :foreign_key => "id"
validates :event_id, presence: true
validates :dog_id, presence: true
end

控制器

class EventsController < ApplicationController
  before_action :logged_in_user

  def index
    @events = Event.paginate(page: params[:page])
  end


  def show
    @event = Event.find(params[:id])
    @bookings = @event.bookings.paginate(page: params[:page])

...

class DogsController < ApplicationController

  def show
    @dog = Dog.find(params[:id])
  end

  def new
    @dog = Dog.new
  end

...

class BookingsController < ApplicationController
end

最后是事件的显示视图和它呈现的 _booking 部分:

<% provide(:title, @event.name) %>
<div class="row">
  <aside class="col-md-4">      
    <section class="event_info">
      <h1><%= @event.name %></h1> - <%= @event.category %>
      <span><b><%= @event.date %></b> <%= @event.start %> - <%= @event.finish %>    </span>
      <span><b>Location:</b> <%= @event.location %></span>
      <%-# Calculated occupany figure goes in line below. -%>
      <span><b>Capacity: </b>X / <%=@event.capacity %></span>
    </section>
  </aside>
  <div class="col-md-8">
    <section class="event_notes_header">
      Description
    </section>
    <section class="event_notes_body">
      <%= @event.description %>
    </section>
    <section class="event_notes_header">
      Notes
    </section>
    <section class="event_notes_body">
      Event notes will be displayed here...
    </section>
  </div>
  <div class="col-md-8">
    <% if @event.bookings.any? %>
      <h3>Bookings (<%= @event.bookings.count %>)</h3>
      <ol class="bookings">
        <%= render @bookings %>
      </ol>
      <%= will_paginate @bookings %>
    <% end %>
  </div>
</div>   

_booking.html.erb

<li id="booking<%= booking.id %>">
  <span class="event"><%= link_to booking.event.name, booking.event %></span>
  <span class="dog"><%= link_to booking.dog.name, booking.dog %></span>
</li>

抱歉,如果我遗漏了任何内容或代码有些复杂 - 这是我在插入和插入内容几天后尝试修复此错误的地方。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 rails-activerecord


    【解决方案1】:

    我在这里看到的第一个问题是你的联想(我相信这是发生这种废话的主要原因)。您的 Booking 模型是 has_many :through 关联的典型加入模型。但是内部关联设置不正确。如果您查看DogBooking 之间的关联,您会注意到有两个has_* 路径而没有belongs_to 路径(需要在模型上,其中包含dog_id ,在本例中为 Booking 模型)。

    因此,您的第一步是正确设置关联。你应该改变

    has_one :dog, :foreign_key => "id"
    

    belongs_to :dog
    

    我建议您对这些关联做的第二件事是摆脱那些 foreign_key 呼叫,这可能只会让您感到困惑,并且只要您遵循惯例就不需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-11
      • 2020-02-23
      • 1970-01-01
      • 2012-04-24
      • 2021-10-25
      • 2012-01-19
      • 2020-04-03
      相关资源
      最近更新 更多