0

Önerilen ürünlerden oluşan bir dizi (predictor-gem ürününe göre) arıyorum ve bu kümeden current_user ürününü hariç tutmak istiyorum. Ben (" != ?") için doğru koşulu kullanıyorum ama sadece doğru şekilde değil düşünüyorum. Bu son dizi @products_rec vermelidir. Ben üzerinden kullanıcılara dayalı current_user ürün çıkarmak isteyenBir kimlik dizisini bulma yönteminden nasıl hariç tutabilirsiniz?

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 

: Modelimin, product.rb var burada

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]) 

ve:

İşte spesifik benim product_controller.rb kod var abonelikler (modele bakınız).

Bunu nasıl çalıştırabilirim, herhangi bir fikir?

Final kodu: @Humza cevabı dayanarak , benim product_controller.rb için aşağıdaki çalışma kodunu ekledikten: değil dizideki kimlikli

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

Hangi Rails sürümünü kullanıyorsunuz? – Pavan

+0

Rails 4 –

+0

@Pavan'ı bu sorunu nasıl çözebileceğime dair herhangi bir fikrim var mı? :) –

cevap

1

bulmak için ürünlere, bunu yapmanız gerekir:

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

Ama bir ürünün bir kullanıcıya ait beri, sadece yapabilirsiniz

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

Ayrıca şöyle not yöntemi kullanabilirsiniz:

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

Düzenleme: Eğer baz ürünleri diğer bazı listeden olmak istiyorsanız

, bu yardımcı olabilir:

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) 

some_list, ActiveRecord::Relation ise, aşağıdakileri yapmanız yeterlidir:

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

Cevabınız için teşekkür ederiz. Şimdiye kadar anlıyorum, ama '@ products_rec'' 'product_rec' '' ('prediktor-gem'den gelen bir dizi ürün kimliği') temel alınarak' current_user' ürün koleksiyonunu daraltmak istiyorum. Ve bunu kodunuza nasıl dahil edeceğimi bilmiyorum. –

+0

@SebastianPlasschaert, "current_user" ürününe ait olanlar hariç tüm ürünleri istiyorsunuz, doğru mu? Eğer evet ise, o zaman 'array' değişkenini nasıl elde ettiğime bakın. – Humza

+0

, tüm ürünlere dayalı olmamalıdır, ancak önceden ayarlanmış olan '@ product_rec' kümesinde (bkz. 'Product_controller.rb'). Zaten @ product_rec.where() 'denedim ama bu işe yaramıyor ... –