创建图书时,如何选择图书的流派

时间:2018-09-29 00:44:37

标签: ruby-on-rails arrays attributes relational-database

我不知道如何为我的问题加上标题,对不起哈哈。我正在构建一个应用程序,用户可以在其中注册作者或审阅者。作者上载属于体裁的书籍。审阅者可以按类型查找要审阅的书籍。当我与作者用户一起创建图书资源时,如何创建一种以新书形式选择该图书所属的多种流派的方式?

我正在学习关于Rails开发的红宝石,并且对它的理解还很早。到目前为止,我已经为我的应用进行了设计,并且正在使用enum为用户注册时创建角色,以便他们既是作者又是评论者。我还设置了一个用户控制器,以便在他们注册时将其重定向到作者个人资料或审阅者个人资料。下一步是弄清楚如何创建书籍所属的流派。任何的意见都将会有帮助。谢谢

1 个答案:

答案 0 :(得分:1)

让我们从数据库开始。我们将创建一个has-and-belongs-to-many关系,

SELECT 
  min(tblhrsmq_op_task_plot.ddate) as ddate1, 
  max(tblhrsmq_op_task_plot.ddate) as ddate2, 
  tblhrsmq_op_task_plot.plot_id, 
  tbltask_id.hrmqtask_name, 
  sum(([hr_end]-[hr_begin])*24) AS qty
FROM tbltask_id INNER JOIN tblhrsmq_op_task_plot ON tbltask_id.hmtask_id = tblhrsmq_op_task_plot.hmtask_id
WHERE (((tblhrsmq_op_task_plot.plot_id)=[Formularios]![frm_export]![txtplot]))
group by tblhrsmq_op_task_plot.plot_id,tbltask_id.hrmqtask_name,
;

现在为模型添加关联:

create_table :books do |t|
  t.string :name
  t.timestamps
end

create_table :genres do |t|
  t.string :name
  t.timestamps
end

create_table :books_genres do |t|
  t.references :book, foreign_key: true
  t.references :genre, foreign_key: true
end

add_index :books_genres, [:book_id, :genre_id], unique: true

对于用户界面,我们可以使用标准的HTML Multiple Select,但是它实际上并不友好,因此我们将使用复选框。

# app/models/book.rb
class Book < ApplicationRecord
  has_and_belongs_to_many :genres
end

# app/models/genres.rb
class Genre < ApplicationRecord
  has_and_belongs_to_many :books
end

现在我们必须在控制器中做一些魔术,因为我们将genre_ids作为哈希值(# config/routes.rb resources :books # this is too much, but you will probably use other actions anyway. # app/controllers/books_controller.rb def new @book = Book.new @genres = Genre.all end # app/views/books/new.html.erb <%= form_with(model: @book, local: true) do |form| %> <%= form.label :name %> <%= form.text_field :name %> <% @genres.each_with_index do |genre, i| %> <%= check_box_tag "book[genre_ids][#{i}]", genre.id %> <%= label_tag "book[genre_ids][#{i}]", genre.name %> <% end %> <%= form.submit %> <% end %> )接收,这会将其转换为{"0" => "1", "1" => "3"}

[1, 3]

最后我们可以采取行动来创建图书

# app/controllers/books_controller.rb
def book_params
  params[:book][:genre_ids] = (params[:book][:genre_ids] || {}).values.map(&:to_i)
  params.require(:book).permit(:name, genre_ids: [])
end

要查看任何复选框,您需要在数据库中保存体裁。您可以通过# app/controllers/book_controller.rb def create @book = Book.new(book_params) if @book.save redirect_to @book else render :new end end 轻松完成此操作:

rails console

复选框可能也不是最好的用户界面,您可能想通过Google搜索用户友好的多项选择,但这应该向您解释您要实现的目标的基本知识。