在Join Table Rails中插入许多行

时间:2017-08-23 03:40:45

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

我有2个主表和一个连接表。书籍,地点和书籍地点。

创建图书时它可以有多个位置,我试图找到将多个locations.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分别插入连接表?

这一切都应该在一个循环中完成还是有更好的方法来解决它?

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

2 个答案:

答案 0 :(得分:2)

首先,我建议您添加一个索引到位置名称,以防您已经没有索引。

您必须查询位置,但不必逐个查询。你可以这样做:

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

或者甚至更好,如果你可以改变传递给你的传递位置ID:

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

然后你可以这样做:

@book.locations << locations

答案 1 :(得分:0)

您可以通过以下方式尝试

@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