【问题标题】:When I create a new table referencing another table the Id it acquires is wrong当我创建一个引用另一个表的新表时,它获取的 Id 是错误的
【发布时间】:2017-08-21 21:39:49
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails sqlite


    【解决方案1】:

    正如 Pavan 指出的那样,您的问题的根本在于您正在通过 params[:id]EventsController 中查找场地,并且在该控制器中 params[:id] 应该参考 @event.id

    另外,你表明你正在查找

    venue_id = Event.select(:venue_id).find(params[:id])
    

    这将为您提供您正在寻找的 Venue id,您可以使用它来执行 @venue = Venue.find(venue_id),但是还有一种更惯用的 Rails 方式来执行此操作:@venue = @event.venue

    由于您的Venue 关联belongs_to :event,您在事件上获得了venue 方法。这与使用@event.venues 的原理相同,因为Event has_many :venues

    Rails ActiveRecord 然后知道如何查找事件并生成一些 SQL,您可以在控制台中查看这些 SQL,例如 SELECT venues.* FROM venues WHERE venues.event_id = $1,并且占位符 $1 被实际的 @venue.event_id 替换。

    【讨论】:

    • 那么你会建议我在我的场地和乐队迁移中加入参考资料吗?即:t.has_many :bands & t.has_many:events。到目前为止,我的事件迁移中只有这些类型的引用
    • 您目前有足够的设置来执行@event.venue@event.band@venue.events@venue.bands@band.events 等操作。如果您要添加Band.has_many :venues, through: :events,您也可以添加@band.venues。我无法更好地回答您的评论,因为我不知道您接下来要做什么。如果您想在原始问题中添加更多内容,请进行编辑并添加。
    【解决方案2】:

    我创建了一个引用该场地的新活动,它正在寻找另一个场地 这在我的 show.erb 文件中不存在

    问题在于如何在 events#show 方法中获取 venues

    @venue = Venue.find(params[:id])
    

    应该是

    @venue = Venue.find(params[:venue_id])
    

    如果params[:venue_id]不可用,那么你可以简单地做

    @venue = @event.venue
    

    【讨论】:

    • 我之前尝试过,我认为它可能是在正确的方向,但它返回“Couldn't find Venue with 'id'=" error
    • @dutchkillsg 这意味着 params[:venue_id] 是 nil。试试@venue = @event.venue
    • 做到了!谢谢你,我很感激我被困了一段时间。对 Rails 相当陌生,所以这是一个实践应用程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2011-02-10
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2017-08-24
    相关资源
    最近更新 更多