我是一個 Rails 初學者,我在理解如何使用 MVC 建立多對多關系時遇到了麻煩。我能找到的所有資源,都不解釋如何在MVC背景關系中通過關聯使用has_many,它們總是使用控制臺來創建物件。
我正在嘗試做的概述:
多用戶多書的圖書館系統,每個用戶可以借出多本書,一本書可以被多個用戶借出。
這是我所擁有的:
Books為 CRUD 操作創建了一個腳手架Users使用設計創建模型- 創建一個第三模型
Checkouts鏈接Books,并Users在has_many through:協會
我需要什么幫助:
我還應該
Checkouts為 CRUD 操作創建一個腳手架嗎?因為當他們在 MVC 背景關系中結帳/歸還書籍時,我需要創建/更新/銷毀書籍/用戶之間的鏈接?這將如何作業,因為我對控制器的唯一體驗是通過Books腳手架創建的,它參考書籍作為@books,Checkouts控制器是否能夠識別我正在嘗試為其創建鏈接的物件Book和User物件,或者這是如何作業的? ?????如果
Checkouts不需要成為 CRUD 操作的腳手架,如何在控制器中創建函式來參考book和user物件并將它們插入資料庫?以及使它成為視圖的可用路線?
請不要在沒有解釋的情況下給我原始鏈接,我已經閱讀了一堆 rails 檔案并觀看了數百個“教程”,但沒有一個在實際的 MVC 用法中解釋它。
uj5u.com熱心網友回復:
- 您不需要為其創建 CRUD
Checkouts,您需要的只是Checkout模型。Rails 使用關聯(has_many、belongs_to 等)來創建模型之間的鏈接。將這些關聯視為基于外鍵連接資料庫中資料的 Rails。你的情況Checkouts是什么將你的鏈接Users和Books資料。如果您查看代碼中的關系,您的模型將如下所示:
結帳.rb
class Checkout
belongs_to :book # Relation to book_id since it is the link table
belongs_to :user # Relation to user_id
end
用戶名
class User
has_many :checkouts # This is your main relation as checkouts table holds the user_id
has_many :books, through: :checkouts # Since checkout.rb holds the foreign key for books, you can use through to go to it from checkout.rb
end
書.rb
class Book
has_many :checkouts
has_many :users, through: :checkouts
end
在高層,在后臺跟蹤如下:用戶has_many結帳和結帳與書籍有關。現在,從用戶通過through結帳獲取所有書籍。
要獲取資料,您的這些關聯Controller如下所示:
@user = User.find(1) # Find the user you want
@user.books # Get all the books that were checkout by the user
如前所述,這@user.books是可能的,因為在模型中宣告了關聯。
- 取決于您的應用程式,只是一個簡單的例子。假設您在 Books 模塊中,并且在視圖中,有一個
checkbox“Checkout book?”。如果復選框被標記并且在您保存條目之前,您可以執行@book.checkouts.build(user_id: id_of_user)。請注意,您不需要添加book_id,這是因為您正在從 構建關系@book,因此它已經隱含在代碼中。然后當您保存時,您將在資料庫中看到該條目。如果你在用戶中,你可以做同樣的事情,但反過來@user.checkouts.build(book_id: id_of_book)。
如果之后,您想檢索拿走這本書的用戶,您可以執行以下操作:
@book = Book.find(1) # Find the book you want
@book.users # Get all the users that checkout that book
更新
是的,
build是rails 中的內置方法。不確定教程/指南,但是對于has_many,您可以這樣做。和同樣的方法belongs_to,你可以做到build_model_name(...)。您看到的教程向您展示了一種方法,即創建/保存到資料庫的常用方法。但是使用該build方法,當它是鏈接表時更容易。在本檔案中,您可以看到所有可用于 ActiveRecord 關聯的類方法。我不確定用戶使用設備,但您不需要為鏈接表結帳創建路由或功能(取決于應用程式)。如果您可以從 devise 訪問當前用戶,您只需要抓住它。
根據您的應用程式,我相信您的主要邏輯在書籍中,因此在創建/更新中您可以執行
@book = Book.new(book_params)
@book.checkouts.build(user_id: @current_user.id)
@book.save
You do not necessarily need the controller to make the connections, Rails uses the Models for this. Controllers are just the actions.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317057.html
標籤:红宝石轨道
上一篇:【Rails】acts_as_paranoid環境,我想物理洗掉使用relationdependent的記錄::destroy
