从现有模型中随机生成项目

时间:2016-04-22 14:18:44

标签: ruby-on-rails ruby ruby-on-rails-3

我对RoR很新,并试图让一个基本的应用程序工作 - 我有一个'书籍'模型和'流派'模型。我希望创建一个页面,随机生成不同类型的书籍供用户选择。

我创建了一个'random_book'控制器,但不确定如何继续进行随机选择和显示。

任何帮助/指示都将不胜感激。

编辑:

以下是我在random_book模型中所做的工作:

“加载'user.rb'

class random_book<的ActiveRecord ::基

 belongs_to :book
 belongs_to :genre


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

谢谢。

1 个答案:

答案 0 :(得分:0)

基于讨论

4个型号

  1. 类型
  2. UserBook
  3. 用户
  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. 创建与您创建的路线相关联的操作,该路线会显示提升列表并将这些书籍添加到用户列表
    3. 在视图中创建表单(任何视图,如现有图书视图中的侧边栏,无关紧要)此表单将发布您刚刚制作的路线和操作
    4. 创建一个视图来呈现图书清单(easy / DRY方式是在现有图书索引中添加一些元素,让用户根据他们的类型图片了解其随机生成的图书清单)
    5. 添加路线

      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 %>
      

      - 我确定你能做的最后一个,它返回一个书籍对象列表,所以解析它最适合你。在控制器操作中,您可以通过在控制器操作中添加这些内容,自动将书籍的ID添加到UserBook模型中:

            @books.each{ |book| book.user_books.create(user: user)}