在我的rails应用程序中,我有3个表。场地,活动和乐队。 我建立了自己的人际关系但是当我创建一个引用Venue的新事件时,它会查找我的show.erb文件中不存在的另一个场所
这些是我的模特
class Venue < ApplicationRecord
has_many :events
has_many :bands, through: :events
end
class Event < ApplicationRecord
belongs_to :venue
belongs_to :band
end
class Band < ApplicationRecord
has_many :events
end
和我的事件迁移
class CreateEvents < ActiveRecord::Migration[5.1]
def change
create_table :events do |t|
t.string :name
t.text :date
t.boolean :alcohol_served
t.string :image
t.belongs_to :venue, show:true
t.belongs_to :band, show:true
t.timestamps
end
end
end
在我的节目控制器中,我有
def show
@event = Event.find(params[:id])
venue_id = Event.select(:venue_id).find(params[:id])
@venue = Venue.find(params[:id])
end
在这种情况下,我能够看到我的活动显示页面,它指定了场地。我有3个场地,3个赛事和3个乐队。主要问题是当我创建第4个活动时,它会寻找第4个场地而不是我指定的场地。
答案 0 :(得分:2)
正如Pavan指出的那样,问题的根源在于您在params[:id]
中EventsController
查找地点,并且在该控制器内params[:id]
应该引用{@event.id
1}}。
此外,您表明您正在查找
venue_id = Event.select(:venue_id).find(params[:id])
它将为您提供您正在寻找的Venue ID,您可以使用它来执行@venue = Venue.find(venue_id)
,但是有更多惯用的Rails方法可以执行此操作:@venue = @event.venue
由于您的venue
关联Venue
,您获得了belongs_to :event
方法。这与使用@event.venues
的原则相同,因为Event
has_many :venues
。
Rails ActiveRecord然后知道如何查找事件并生成一些SQL,您可以在控制台中查看SELECT venues.* FROM venues WHERE venues.event_id = $1
,并将占位符$1
替换为实际的@venue.event_id
。< / p>
答案 1 :(得分:1)
我创建了一个新的事件,引用了Venue,它寻找另一个场所 我的show.erb文件中不存在
问题在于如何在venues
方法
events#show
@venue = Venue.find(params[:id])
应该是
@venue = Venue.find(params[:venue_id])
如果params[:venue_id]
不可用,那么您可以轻松完成
@venue = @event.venue