繁体   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