Rails:如何显示数据库中是否已存在值

时间:2018-05-26 06:16:05

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

我的应用从Shopify商店导入产品。它需要满足以前导入我的应用程序数据库的产品,并显示自上次导入以来已添加到Shopify商店的所有新产品。

我的观点是:

  # All new products in Shopify
  <% @products.each do |product| %>      
        <tr>
            <td><%= product.id %></td>
            <td><%= product.title %></td>
       </tr>  
   <% end %>

   # All existing products in my app
   <% @myproducts.each do |myproduct| %>
        <tr>
            <td><%= myproduct.id %></td>
            <td><%= myproduct.title %></td>
        </tr>       
   <% end %> 

负责抓住这些内容的ProductsController控制器部分是:

   @products = ShopifyAPI::Product.find(:all)
   @myproducts = Product.where.not(id: nil) 

问题是第一个循环显示Shopify商店中的所有产品,包括那些已经在@myproduct.each do循环中的产品。所以我们最终会有很多翻倍。

我需要@products.each循环才能显示product.id尚不存在myproduct.id的产品。

我应该在我的视图中使用if语句还是在@products = ShopifyAPI::Product.find(:all)中使用某些条件?

2 个答案:

答案 0 :(得分:1)

是的!

ShopifyAPI::Product.find(:all)将获取商店中的所有商品。 所以你需要将条件添加到控制器中。

选项1

@myproducts = Product.where.not(id: nil).select(:id, :title)
@products = ShopifyAPI::Product.find(:all)
myproducts_titles = @myproducts.map(&:title)
@products = @products.reject do |product|
  myproducts_titles.include? product.title
end

1选项

@myproducts = Product.where.not(id: nil).select(:id, :title)
myproducts_titles = myproducts.map(&:title)
@products = ShopifyAPI::Product.find(:all)
products_titles = @products.map(&:title)
newproducts_titles = products_titles - myproducts_titles
@products = @products.select do |product|
  newproducts_titles.include? product.title
end



我不确定哪个选项更快

答案 1 :(得分:1)

我自己尝试过一些东西。我介绍说:

@productIds = Product.pluck(:product_id)

然后是一个新循环:

 @products.delete_if do |product|
  if product.id.in?(@productIds)
    true 
  end
end

现在似乎就是这样做的。