在rails中获取随机产品

时间:2013-11-27 18:39:44

标签: ruby-on-rails ruby postgresql

/products/index.html.erb

<div class="hide-for-small panel">
  <h3>Sidebar</h3>
  <h5 class="subheader">Feature Product</h5>
    <% Product.random do | product | %>
     <%= image_tag(Product.image_url) %> 
     <h5><%= link_to Product.title, product %></h5>
     <p><%= button_to 'Add to Cart', line_items_path(:product_id => product) %></p>
    <% end %>               
</div>

/models/product.rb

def Product.random
 self.limit(1).offset(rand(self.count)).first 
end

尝试使用Postgres提取随机产品。查询在控制台中出现,但我在索引中没有查看结果。

任何解决方案或不同的方法来实现这一目标?

4 个答案:

答案 0 :(得分:1)

您的image_tag和链接中的产品看起来不正确地引用模型而不是随机模型。

尝试更改这些:

  <%= image_tag(product.image_url) %> 
 <h5><%= link_to product.title, product %></h5>

答案 1 :(得分:1)

您应该在控制器中生成随机产品,并在视图中访问实例变量。

像: 控制器的索引动作:

@random_product = Product.random

视图:

<%= image_tag(@random_product.image_url) %>

等。 您永远不应该直接从视图访问模型。

答案 2 :(得分:1)

首先,您将类方法与实例方法混合在一起。尝试制作视图:

<div class="hide-for-small panel">
  <h3>Sidebar</h3>
  <h5 class="subheader">Feature Product</h5>
  <%= image_tag(@product.image_url) %> 
  <h5><%= link_to @product.title, @product %></h5>
  <p><%= button_to 'Add to Cart', line_items_path(:product_id => @product.id) %></p>
</div>

类方法(Product.random)在您不需要特定方法时定义。如果是特定产品,请product.title

其次,在您的控制器中执行此操作,您需要将@product实例变量定义为@product = Product.random。然后你可以在视图中使用它。

第三,获取随机记录可以简化为:

Product.order("RANDOM()").first

所以你的模型代码如下:

def self.random
  Product.order("RANDOM()").first 
end

答案 3 :(得分:1)

整个问题是你将一个块传递给一个没有阻塞的方法,所以它被默默地忽略,从未被执行过,所以其他问题你没有来起来。

您的所有代码都位于您通过Product.random传递给Product.random do |product|的块中。这应该是product = Product.random,没有do/end阻止。

完成此操作后,当您使用Product.title代替product.title等时,您会看到更多错误。