我有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分别插入连接表?
这一切都应该在一个循环中完成还是有更好的方法来解决它?
非常感谢任何建议,谢谢。
答案 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