[英]How to create join table record in Rails, has many: through relationship
[英]how to create a record for a join table?
我設置了以下關聯:
class Book < ActiveRecord::Base
belongs_to :author
belongs_to :category
has_many :users_books
has_many :users, through: :user_books
end
和
class User < ActiveRecord::Base
has_many :users_books
has_many :books, through: :users_books
end
我應該創建一個連接表遷移
class CreateUsersBooks < ActiveRecord::Migration[4.2]
def change
create_table :users_books do |t|
t.integer :user_id
t.integer :book_id
end
end
end
現在我需要創建一個名為 check_out_book 的方法,它接收一本書和一個作為 arguments 的到期日期。 當用戶簽出一本書時,它應該創建一個新的 UserBook 記錄(或 Checkout 記錄或任何您想稱呼您的加入表/模型)。 那個新的 UserBook 記錄應該有一個返回的屬性(以及表列)? 這應該默認為假。 我將如何 go 關於創建此方法和遷移?
您在 Rails 中的表名和關聯應該始終是singular_plural
,除了(非常沒用的) has_and_belongs_to_many
關聯使用的奇怪的小鴨“無頭”連接表。
class CreateUserBooks < ActiveRecord::Migration[4.2]
def change
create_table :user_books do |t|
t.references :user
t.references :book
t.boolean :returned, default: false
end
end
end
class UserBook < ActiveRecord::Base
belongs_to :user
belongs_to :book
end
class Book < ActiveRecord::Base
belongs_to :author
belongs_to :category
has_many :user_books
has_many :users, through: :user_books
end
class User < ActiveRecord::Base
has_many :user_books
has_many :books, through: :user_books
end
但是你真的應該使用一個更好的更具描述性的名稱來告訴其他程序員這在域中代表什么,而不僅僅是它加入的兩個模型的合並,例如 Loan 或 Checkout。
我還將使用t.datetime:returned_at
創建一個日期時間列,該列可以記錄實際歸還圖書的時間,而不僅僅是 boolean。
如果要使用除外鍵之外的任何其他數據創建連接記錄,則需要顯式創建而不是隱式創建(例如通過user.books.create()
)。
@book_user = Book.find(params[:id]).book_users.create(user: user, returned: true)
# or
@book_user = current_user.book_users.create(book: user, returned: true)
# or
@book_user = BookUser.new(user: current_user, book: book, returned: true)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.