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