簡體   English   中英

如何為連接表創建記錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM