0

J'appelle une gamme de produits recommandés (sur la base predictor-gem) et que vous voulez exclure les produits du current_user de cet ensemble. Je pense que j'utilise la bonne condition pour cela (" != ?") mais juste pas de la bonne façon. @products_rec devrait donner ce tableau final.Comment exclure un tableau d'ID d'une méthode de recherche?

Voici le code spécifique dans mon product_controller.rb:

recommender = ProductRecommender.new 

    products = current_user.products 

    @product_rec = (recommender.similarities_for("product-#{@product.id}")).map {|el| el.gsub(/(.*\-)[^\d]*/, "")} 
    @products_rec = Product.find(@product_rec, :conditions => ["id != ?", products.id]) 

et voici mon modèle, product.rb:

class Product < ActiveRecord::Base 

    include Reviewing 
    include PublicActivity::Model 
tracked 

extend FriendlyId 
friendly_id :name, use: [:slugged, :finders] 

belongs_to :category 

belongs_to :benefit 

has_many :subscriptions 
has_many :users, through: :subscriptions 

has_many :benefits 
has_many :projects, through: :benefits 

belongs_to :user 

validates :name, presence: true, length: { maximum: 200 } 
validates :gtin, presence: false 
validates :content, presence: false, length: { maximum: 2000 } 
validates :video, presence: false 
validates :tag, presence: false 
validates :project, presence: false 
validates :category, presence: false 
validates :user, presence: false 

has_attached_file :image, :styles => { :medium => "680x300>", :thumb => "170x75>" } 
validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/ 

end 

Je veux exclure les produits du current_user, sur la base des utilisateurs par le biais abonnements (voir modèle).

Comment puis-je obtenir ce travail, des idées?

Code final: Sur la base de la réponse de @Humza, j'ai ajouté le code de travail suivant à mes product_controller.rb:

recommender = ProductRecommender.new 

    products = current_user.products.select("id") 

    @product_rec = (recommender.similarities_for("product-#{@product.id}")).map {|el| el.gsub(/(.*\-)[^\d]*/, "")} 
    @products_rec_array = Product.find(@product_rec) 
    @products_rec = Product.where(id: @products_rec_array).where.not(id: products) 
+0

Quelle version de Rails que vous utilisez? – Pavan

+0

J'utilise Rails 4 –

+0

@Pavan des idées sur la façon dont je pourrais résoudre ce problème? :) –

Répondre

1

Pour trouver des produits avec identifiant pas dans le tableau, vous devez faire ceci:

array = current_user.products.pluck(:id) 
Product.where('id NOT IN (?)', array) # '?' is surrounded by paranthesis 

Mais comme un produit appartient à un utilisateur, vous pouvez simplement faire

Product.where('user_id != ?', current_user.id) 

Vous pouvez également utiliser la méthode not comme ceci:

Product.where.not(id: array) 
Product.where.not(user_id: current_user.id) 

Edit:

Si vous voulez que les produits de base à partir d'une autre liste, cela peut aider:

base_product_ids = some_list.map(&:id) # assuming this is an Array 
Product.where(id: base_product_ids).where.not(user_id: current_user.id) 

Si some_list était un ActiveRecord::Relation, vous auriez simplement pu le faire:

some_list.where.not(user_id: current_user.id) 
+0

Merci pour votre réponse. Je comprends jusqu'à présent, mais '@ products_rec' doit être basée sur' @ product_rec' (c'est un tableau d'identification de produit vient du 'prédicteur-gem'), dont je veux nuire collection de produits de' current_user'. Et je ne sais pas comment l'intégrer dans votre code. –

+0

@SebastianPlasschaert, vous voulez tous les produits sauf ceux qui appartiennent à 'current_user', non? Si oui, regardez comment j'obtiens la variable 'array'. – Humza

+0

il ne devrait pas être fondée sur tous les produits, mais sur l'ensemble présélectionné '@ product_rec' (voir' product_controller.rb'). J'ai déjà essayé '@ product_rec.where()' mais cela ne semble pas fonctionner ... –