Rails: как показать, если значение уже существует в базе данных - PullRequest
0 голосов
/ 26 мая 2018

Мое приложение импортирует товары из магазина 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 голосов
/ 26 мая 2018

Я попробовал что-то сам.Я ввел:

@productIds = Product.pluck(:product_id)

Затем новый цикл:

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

Кажется, сейчас нужно сделать этот трюк.

0 голосов
/ 26 мая 2018

Да!

ShopifyAPI::Product.find(:all) получит все товары в магазине.поэтому вам нужно добавить условие в ваш контроллер.

Option1

@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

Option2

@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



Я не уверен, намного ли быстрее какие опции

...