Rails - 返回错误 ID 列表
Rails - Returning list of incorrect ids
我有一个包含 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
最后是 Events 的显示视图及其呈现的 _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>
如果我遗漏了什么或者代码有点复杂,我深表歉意 - 这就是我在插入和拔出东西几天后尝试修复此错误的地方。
我在这里看到的第一个问题是你的联想(我相信这是发生这种废话的主要原因)。您的预订模型是 has_many :through
协会的典型加入模型。但是内部关联设置不正确。如果您查看 Dog
和 Booking
之间的关联,您会注意到有两个 has_*
路径并且没有 belongs_to
路径(需要在模型上,其中包含 dog_id
,在本例中为 Booking
模型)。
因此,您的第一步是正确设置关联。你应该改变
has_one :dog, :foreign_key => "id"
至
belongs_to :dog
我建议您对这些关联做的第二件事是摆脱那些 foreign_key
调用,它们可能只会让您感到困惑,只要您遵循约定就不需要它们。
我有一个包含 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
最后是 Events 的显示视图及其呈现的 _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>
如果我遗漏了什么或者代码有点复杂,我深表歉意 - 这就是我在插入和拔出东西几天后尝试修复此错误的地方。
我在这里看到的第一个问题是你的联想(我相信这是发生这种废话的主要原因)。您的预订模型是 has_many :through
协会的典型加入模型。但是内部关联设置不正确。如果您查看 Dog
和 Booking
之间的关联,您会注意到有两个 has_*
路径并且没有 belongs_to
路径(需要在模型上,其中包含 dog_id
,在本例中为 Booking
模型)。
因此,您的第一步是正确设置关联。你应该改变
has_one :dog, :foreign_key => "id"
至
belongs_to :dog
我建议您对这些关联做的第二件事是摆脱那些 foreign_key
调用,它们可能只会让您感到困惑,只要您遵循约定就不需要它们。