2016-04-22 4 views
-1

Я довольно новичок в RoR и пытаюсь получить базовое приложение для работы - у меня есть модель «книг» и модель «жанра». Я хочу создать страницу, которая случайно генерирует книги разных жанров для выбора пользователем.Случайное поколение предметов из существующей модели

Я создал контроллер «random_book», но не уверен, как продолжить случайный выбор и отображение.

Любая помощь/указатели будут оценены.

Edit:

Вот работа, которую я делал в модели random_book:

"нагрузка 'user.rb'

класс random_book < ActiveRecord :: Base

belongs_to :book 
belongs_to :genre 


def get_random_book 
    find(:all).sample(5) 
end 

"

спасибо.

+0

Хотите ли вы случайно * генерировать * (он же создать) записи в базе данных для этого пользователя ? Или вы хотите случайно загрузить * существующие записи из базы данных? Если вы хотите создать, вам все равно, имеют ли смысл названия книг, имена авторов и жанры? – spickermann

+0

Я хочу создавать/создавать записи - но они должны принадлежать к трем жанрам (художественная, художественная, поэтическая). имена не имеют значения - я собирался использовать список случайных слов – katebeckett

+0

Является ли жанр собственной моделью? – trh

ответ

0

На основе обсуждения

4 модели

  1. сайте
  2. Жанр
  3. UserBook
  4. Пользователь

Они будут выглядеть примерно так:

class User < ActiveRecord::Base 
    has_many :user_books 
    has_many :books, through: :user_books 
end 

class Genre < ActiveRecord::Base 
    has_many :books 

    def fetch_random_books(qty) 
    #you want to make sure you don't error out by requesting a sample of an empty list of books so check first. The qty argument lets you control the number of books for the search 
    unless self.books.empty? 
     self.books.limit(qty).sample 
    end 
    end 
end 

class Book < ActiveRecord::Base 
    belongs_to :genre 
    has_many :user_books 
end 

class UserBook < ActiveRecord::Base 
    belongs_to :book 
end 

Я бы скорее всего использовал другой маршрут для секции случайных книг, потому что это не очень удобно для написания кода, например, user_book.

Есть 4 вещи, чтобы сделать

  1. Создать новый маршрут, чтобы получить список genre_ids, который выбирает пользователь.
  2. Создайте действие, которое соотносится с созданным вами маршрутом, который отображает список boos и добавляет эти книги в список пользователей.
  3. Создайте форму в виде (любое представление, например, боковая панель в существующем представлении книг, doesn Не имеет значения, эта форма отправит маршрут и действие, которое вы только что сделали.
  4. Создайте представление, чтобы отобразить список книг (простой/суточный способ состоит в том, чтобы добавить несколько элементов в существующий индекс книг, чтобы пользователи знали его случайное генерируется список книг на основе их жанровых фотографии)

Добавить маршрут

post "/random-books", to: "books#random_books", as: :random_books 

Создать действие в books_controler

def random_books 
    if params[:genre_ids] 
    genres = Genre.where(id: params[:genre_ids]) 
    @books = [] 
    genres.each do |genre| 
     @books << genre.fetch_random_books(10) 
    end 

    else 
    @books = nil 
    end 
    respond_to do |format| 
    format.html { render action: :index } 

    end 
end 

Затем создать форму, которая делает post запрос на указательном действия books_controller - Вы можете разобрать форму и обновить модель UserBook внутри этого действия, и затем отображать список книг одновременно.

<%= form_tag(random_books_path, method: :post) do %> 
    <ul> 
    <% Genre.all.each do |genre| %> 
     <li> 
     <label class='genre-select'> 
     <%= check_box_tag 'genre_ids[]', genre.id -%> 
     <%= genre.name %> 
     </label> 

     </li> 
    <% end %> 
    </ul> 
    <%= submit_tag "Fetch Book List"%> 
<% end %> 

- Последний один я уверен, что вы можете сделать, это возвращает список объектов книги так разобрать ее, однако лучше всего работает для вас. В действии контроллера вы можете автоматически добавить идентификаторы для книг в модель UserBook, добавив это в действии контроллера:

 @books.each{ |book| book.user_books.create(user: user)} 
Смежные вопросы