как создать запись для таблицы соединений? - PullRequest
0 голосов
/ 04 мая 2020

У меня настроены следующие ассоциации:

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, который принимает в качестве аргументов книгу и due_date. Когда пользователь извлекает книгу, он должен создать новую запись UserBook (или запись Checkout, или как вы хотите позвонить, присоединитесь к таблице / модели). Эта новая запись UserBook должна иметь атрибут (и, следовательно, столбец таблицы) возвращаемого? который должен по умолчанию ложь. Как бы я go о создании этого метода и миграции?

1 Ответ

1 голос
/ 04 мая 2020

Ваши имена таблиц и ваши ассоциации в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...