У Rails есть много через ассоциацию - Использование включает в себя - PullRequest
0 голосов
/ 04 декабря 2018

Есть 3 таблицы - книги, пользователи, рейтинг

Таблица книг содержит заголовок, идентификатор, описание

таблица рейтингов содержит - идентификатор, значение, идентификатор_пользователя, идентификатор_базы

Условия для выполнения следующие:

  • Книга может иметь много оценок
  • Пользователь может добавить множество оценок

  • Пользователь можетдобавить только один рейтинг для одной книги

Ниже приведены ассоциации

book.rb

has_one :rating
has_many :users, through: :rating

rating.rb

belongs_to :book
belongs_to :user

user.rb

 has_one :rating
 has_many :books, through: :rating

books_controller.rb

def show
  @book = Book.fetch_record(params[:id], @current_user.id)
  set_book if @book.blank?
  json_response(@book)
end

book.rb

    def self.fetch_record(id, user_id)
      joins(:rating).where("ratings.book_id = ? and ratings.user_id = ?", id, user_id).first
    end

В настоящее время я использую объединения для получения сведений,

Как добиться того же, используя включает ??

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Используя includes или joins, вы можете вкладывать хэш-код в метод поиска, например find_by или where:

Book.includes(:rating).find_by(ratings: { book_id: id, user_id: user_id }
# or
Book.includes(:rating).where(ratings: { book_id: id, user_id: user_id }.first

# nested hash also works with `joins`, just for FYI
Book.joins(:rating).where(ratings: { book_id: id, user_id: user_id }.first

Общая информация:

  • ratings: в вышеприведенном коде должно быть именем таблицы (ratings), а не именем ассоциации (rating).
  • Вложенный хэш может идти глубже, если вы захотите:т.е.:

    # say your `User` model `has_many :comments` having `:content` attribute
    
    Book.includes(rating: { user: :comments }).where(
      ratings: { users: { comments: { content: 'HELLO WORLD' } } }
    )
    
    # or following also works (because there are no conflicts of association names in the query
    Book.includes(rating: { user: :comments }).where(
      comments: { content: 'HELLO WORLD' }
    )
    
0 голосов
/ 04 декабря 2018

Используйте references с includes.

  includes(:rating).references(:rating).where("ratings.book_id = ? and ratings.user_id = ?", id, user_id).first

Стоит прочитать: https://blog.arkency.com/2013/12/rails4-preloading/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...