Ruby on rails 在多对多关系中有条件地显示资源-Rails 4
正在使用我的第一个Rails应用程序。它将用于搜索和查看特定类别书籍上的数据 两种资源:Ruby on rails 在多对多关系中有条件地显示资源-Rails 4,ruby-on-rails,ruby,ruby-on-rails-4,many-to-many,strong-parameters,Ruby On Rails,Ruby,Ruby On Rails 4,Many To Many,Strong Parameters,正在使用我的第一个Rails应用程序。它将用于搜索和查看特定类别书籍上的数据 两种资源:类别和书籍。我创建了一个多对多HMT(has many-through)关系(如下),因为每个类别都有很多书,而且每本书都属于多个类别。以下是相关控制器代码: 类别模型(Category.rb) 我有一个显示每个类别的show视图。在这个视图中,我想展示每个对应类别中的书籍。我有这些简单的循环: .col-1-3 %strong TITLE %ul - @books.each do |book
类别
和书籍
。我创建了一个多对多HMT(has many-through)关系(如下),因为每个类别都有很多书,而且每本书都属于多个类别。以下是相关控制器代码:
类别模型(Category.rb)
我有一个显示每个类别的show视图。在这个视图中,我想展示每个对应类别中的书籍。我有这些简单的循环:
.col-1-3
%strong TITLE
%ul
- @books.each do |book|
%li= book.title
.col-1-3
%strong AUTHOR
%ul
- @books.each do |book|
%li= book.author
.col-1-3
%strong ULR
%ul
- @books.each do |book|
%li= book.url
在我的分类模型中,我有以下内容:
def show
@books = Book.order("title").includes(:categorizations).select("books.*")
end
def book_params
params.require(:book).permit(:books => [{:title => [:book_id]}, {:id => [:category_id]}, :author, :url] )
end
问题出在这里,从我视图中的循环中,我接收到来自所有书籍的信息(即:数据库中所有书籍的标题、作者和URL),我只希望这些信息来自该特定类别的书籍
我认为我需要更改我的categories\u controller.rb中的逻辑,是否正确?我意识到我正在选择所有的书籍。选择(“books.*”
,但我不知道如何编辑它,以便有条件地只调用与显示视图中显示的类别相匹配的书籍
感谢你的见解
更新:
意识到这些信息也很有帮助。为书籍指定类别时(在书籍创建时),我使用以下代码:
= check_box_tag "book[category_ids][]", category.id, @book.category_ids.include?(category.id), id: dom_id(category)
也许可以在类别模型中引用dom\u id(category)
原谅我的“菜鸟”。我是一个前端的家伙,现在才开始真正冒险进入后端 一种可能的解决方案是在这样的类别中更改show action
@图书=类别。查找(参数[:id])。图书
假设:id参数是类别的id(如果您在类别控制器中,这将是惯例)
如果您不需要关于类别的信息,而只需要书籍,那么可以对分类进行联接(而不是包含),并使用where-like分类:{category_-id:params[:id]}。这没有第一个选项那么清楚,但是如果您没有显示有关类别的信息,它会保存一个查询。如果您在视图中添加一个循环(在第一个.col-1-3
上方),则只能在视图中使用一个循环。嗯。。。循环位于每个.col-1-3
列的内部,显示良好。如前所述,问题是我得到的是所有的书籍和它们的数据,而我只想要它们各自类别中的那些。这就是我们手头的问题。当然,这就是为什么要把它添加到评论中而不是答案中。最好使用一个循环而不是三个;)为了性能。啊,明白了:)我误解了你,认为你的意思是“你只能在你的视图中使用一个循环…”完全被误解了。是的,这里一个循环可能比三个好。。。很可能会在以后重构它。工作!非常感谢。此外,我需要显示有关类别和书籍的信息,因此需要包含。
create_table "books", force: true do |t|
t.string "title"
t.string "url"
t.integer "rank_overall"
t.integer "rank_category"
t.decimal "price"
t.integer "reviews"
t.decimal "rating"
t.date "published"
t.string "img_cover"
t.string "author"
t.datetime "created_at"
t.datetime "updated_at"
t.string "asin"
t.integer "length"
end
create_table "categories", force: true do |t|
t.string "name"
t.text "content"
t.string "ancestry"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "categories", ["ancestry"], name: "index_categories_on_ancestry", using: :btree
create_table "categorizations", force: true do |t|
t.integer "book_id"
t.integer "category_id"
t.integer "rank"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "categorizations", ["book_id"], name: "index_categorizations_on_book_id", using: :btree
add_index "categorizations", ["category_id"], name: "index_categorizations_on_category_id", using: :btree
.col-1-3
%strong TITLE
%ul
- @books.each do |book|
%li= book.title
.col-1-3
%strong AUTHOR
%ul
- @books.each do |book|
%li= book.author
.col-1-3
%strong ULR
%ul
- @books.each do |book|
%li= book.url
def show
@books = Book.order("title").includes(:categorizations).select("books.*")
end
def book_params
params.require(:book).permit(:books => [{:title => [:book_id]}, {:id => [:category_id]}, :author, :url] )
end
= check_box_tag "book[category_ids][]", category.id, @book.category_ids.include?(category.id), id: dom_id(category)