当我创建一个引用另一个表的新表时,它获取的Id是错误的

时间:2017-08-21 13:21:27

标签: ruby-on-rails sqlite

在我的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个场地而不是我指定的场地。

2 个答案:

答案 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