Ваши имена таблиц и ваши ассоциации в 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 :users, through: :user_books
end
Но вы действительно должны использовать более понятное имя, которое сообщает другим программистам, что это представляет в домене, а не просто объединение двух моделей, к которым он присоединяется, таких как Loan или Checkout.
Я бы также использовал t.datetime :returned_at
для создания столбца datetime, который может записывать, когда книга действительно возвращается, а не просто логическое значение.
Если вы хотите создать запись соединения с любыми дополнительными данными, кроме внешних ключей вам нужно создать его явно, а не неявно (например, 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)