2016-04-22 14 views
-1

RoRにはかなり新しく、基本的なアプリを動作させようとしています。私は「書籍」モデルと「ジャンル」モデルを持っています。ユーザーが選択できるように、さまざまなジャンルの書籍をランダムに生成するページを作成したいと考えています。既存のモデルからのアイテムのランダム生成

私は 'random_book'コントローラを作成しましたが、ランダムな選択と表示を続行する方法は不明です。

助けていただけたら助かりますか?

編集:

ここで私はrandom_bookモデルで行ってきた作品だ:

"負荷 'user.rb'

クラスは<のActiveRecord ::ベースをrandom_book

belongs_to :book 
belongs_to :genre 


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

"

ありがとうございます。

+0

はあなたがランダムに*そのユーザーのデータベース内のエントリ(別名作成)*を生成したいですか:コントローラのアクションでは、自動的にコントローラのアクション内でこれを追加することにより、UserBookモデルへの書籍のIDを追加することができます?または、データベースからランダムに*既存のエントリをロードしたいですか?あなたが作成したい場合は、書籍のタイトル、著者名、ジャンルが実際に意味を持つかどうか気にしますか? – spickermann

+0

私はエントリを生成/作成したいですが、3つのジャンルのタイプ(フィクション、ノンフィクション、詩)に属している必要があります。名前は関係ありません - 私は無作為な単語のリストを使用するつもりだった – 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のようなコードを記述するのはあまり親切ではないからです。

ユーザーが選択genre_idsのリストを取得するために新しいルートを作成します

  1. を行うには4つのものがあります。
  2. boosのリストをレンダリングしてそれらの書籍をユーザーリストに追加するために作成したルートに関連するアクションを作成します。
  3. ビューを作成します(既存のブックビューのサイドバーのようなビュー、あなたが今作成したルートとアクションを投稿します。
  4. ブックリストを表示するためのビューを作成します(簡単/ DRY方法は、既存のブックのインデックスにいくつかの要素を追加して、そのジャンルの写真をもとに、書籍の生成リスト)

はルートを追加

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

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 

が続いbooks_controllerのindexアクションへpost要求を行い、フォーム作成books_controlerでアクションを作成 - あなたはフォームを解析し、そのアクション内部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 %> 

- 私はあなたが行うことができると確信してい最後の1、それはそう、それはしかし、あなたに最適な解析ブックオブジェクトのリストを返します。

 @books.each{ |book| book.user_books.create(user: user)} 
関連する問題