【问题标题】:Insert many rows into Join Table Rails在 Join Table Rails 中插入多行
【发布时间】:2018-01-31 11:38:54
【问题描述】:

我有 2 个主表和一个连接表。书籍、位置和书籍位置。

当一本书被创建时,它可以有很多位置,我试图找到将许多位置的最佳方法。id 插入连接表。

def create
  @book = Book.new(book_params)

  if @book.save
   render json: @book, status: :created, location: @book
  else
   render json: @book.errors, status: :unprocessable_entity
  end
end

说这是我传递给 /books 的参数

 {
  name: "NewBook",
  locations: ["New York", "Boston", "Toronto"]
 }

要获取要插入连接表的位置 ID,我是否必须查询位置表并匹配名称,然后将 ID 单独插入连接表?

这一切都应该循环完成还是有更好的方法?

非常感谢任何建议,谢谢。

【问题讨论】:

  • @book.locations.create([{name: "New York"},{name: "Boston"},{name: "Toronto"}])

标签: ruby-on-rails activerecord inner-join outer-join jointable


【解决方案1】:

首先,我建议您为位置名称添加索引,以防您还没有索引。

您必须查询位置,但不必一一查询。您可以执行以下操作:

locations = Location.where(name: params[:locations])

或者更好的是,如果您可以更改要传递的参数以传递位置 ID:

locations = Location.find(params[:locations])

然后你可以这样做:

@book.locations << locations

【讨论】:

    【解决方案2】:

    您可以通过以下方式尝试

    @book.locations.create(params[:locations].inject([]){|s,p| s << {name: p}})
    

    实际上是在执行以下操作

      @book.locations.create([{name: "New York"},{name: "Boston"},{name: "Toronto"}])
    

    或者你可以

      @locations = Location.where(name: params[:location])
    
      @book.locations << @locations
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 2022-10-06
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 2020-03-27
      相关资源
      最近更新 更多