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
现在似乎可以使用这个技巧。
我的应用从 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
现在似乎可以使用这个技巧。