【问题标题】:Store Join Model Data in Rails [duplicate]在 Rails 中存储连接模型数据
【发布时间】:2020-11-12 18:39:17
【问题描述】:

我是 Ruby on Rails 的新手,我正在开发一个后端 API。

目前,我有 2 个 Active Record 模型,分别称为 BookGenre

活动记录模型

class Book < ActiveRecord::Base
    has_and_belongs_to_many :genres
end

class Genre < ActiveRecord::Base
    hast_and_belongs_to_many :books
end

数据库架构模型

create_table :books do |t|
  t.string "title"
end

create_table :genres do |t|
  t.string "genre"
end

create_join_table :books, :genres do |t|
  t.index [:book_id, :genre_id]
  t.index [:genre_id, :book_id]
end

REST POST 请求

 # POST /book
    def create
        book= Book.new(books_params)

        if book.save
            render json: {status: 'SUCCESS', message:'Book Saved', data: book},status: :ok
        else
            render json: {status: 'ERROR', message: 'Booknot saved', data: book.errors}, status: :unprocessable_entity
        end 

    end

private
    def books_params
        params.require(:book).permit(:title)
    end

问题

我想发出一个 HTTP Post 请求来创建一本具有流派的新书。我已经测试了书的插入(没有流派,只是传递书名),它工作得很好。不过我还想添加一些流派类别。

【问题讨论】:

  • 欢迎来到 Stack Overflow!您的问题部分中似乎没有具体的、可回答的问题,在这种情况下,社区可能很难给出具体的答案。你都尝试了些什么?您是否遇到特定错误或问题?您应该edit您的问题包括您迄今为止尝试自己实施的任何内容,以及为什么/如何在您的情况下不起作用。
  • @Hoppeduppeanut 谢谢!我想要实现的是存储从前端表单发送的数据。在“问题”部分,我说过我尝试发送书籍数据(没有流派数组),到目前为止它工作得很好。但是,现在我想创建一本带有流派数组的新书,用于实例流派_id [1, 2]。我应该怎么做才能将流派存储在“def create”部分? book = Book.new(books_params) 只创建一本新书,但新创建的书没有在连接表中分配其流派。另外,我认为我需要先在流派表中创建流派。

标签: mysql ruby-on-rails ruby activerecord backend


【解决方案1】:

the has_many and has_and_belongs_to_many class methods 都创建了一组_ids setter 和 getter:

book = Book.new
book.genre_ids = [1, 2, 3]
book.genre_ids == [1, 2, 3] # true

这些设置器将自动创建和删除连接表中的行。由于ActiveModel::AttributeAssignment 将哈希参数映射到.new.update.create 到模型中的设置器,因此您只需将genre_ids 参数列入白名单:

def books_params
  params.require(:book).permit(:title, genre_ids: [])
end

传递一个空数组允许permitted scalar values 的数组,例如数字或字符串。

【讨论】:

  • 到目前为止一切顺利,现在我希望收到一系列genre_ids,如何将它们分配给book.genre_ids?看来你提供的例子,你直接分配流派(1,2,3)我试过 book.genre_ids = books_params[:genre_ids]
  • 您将在请求正文中传递一个类似于 { "book": { "title": "AN Example Book", "genre_ids": [1, 2, 3] }} 的 JSON 对象。当您使用book = Book.new(books_params) 传递列入白名单的参数哈希时,assign_attributes 将调用设置器。您实际上不必手动执行任何操作。这就是批量分配的重点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多