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

Rails: How to show if value already exists in database

我的应用从 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) 中使用某些条件?

是的!

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

选项2

@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



我不确定哪个选项更快

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

@productIds = Product.pluck(:product_id)

然后是一个新的循环:

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

现在似乎可以使用这个技巧。