0

Я вызываю массив рекомендуемых продуктов (на основе predictor-gem) и хочу исключить из этого набора продукты current_user. Я думаю, что я использую надлежащее условие для него (" != ?"), но только не в правильном направлении. @products_rec должен дать этот окончательный массив.Как исключить массив id из метода find?

Вот конкретный код в моем 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]) 

и вот моя модель, 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 

Я хочу, чтобы исключить продукты из current_user, на основе пользователей через подписки (см. модель).

Как я могу заставить это работать, любые идеи?

Окончательный код: На основании ответа @Humza, я добавил следующий рабочий код в мой 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

Какую версию Rails вы используете? – Pavan

+0

Я использую Rails 4 –

+0

@Pavan любые идеи о том, как я мог это решить? :) –

ответ

1

Чтобы найти продукты с идентификатором не в массиве, вы должны сделать это:

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

Но поскольку продукт принадлежит пользователю, вы можете просто сделать

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

Вы также можете использовать метод not как так:

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

Edit:

Если вы хотите базовые продукты, чтобы быть из другого списка, это может помочь:

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, вы могли бы просто сделать:

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

Благодарим вас за ответ. Я понимаю это до сих пор, но '@ products_rec' должен основываться на' @ product_rec' (это массив идентификаторов продукта, поступающий из 'predor-gem'), из которого я хочу отвлечь коллекцию товаров' current_user'. И я не знаю, как включить это в свой код. –

+0

@SebastianPlasschaert, вы хотите, чтобы все продукты, кроме тех, которые принадлежат 'current_user', правильно? Если да, то посмотрите, как я получаю переменную 'array'. – Humza

+0

он не должен основываться на всех продуктах, а на предварительно выбранном наборе '@ product_rec' (см.' Product_controller.rb'). Я уже пробовал '@ product_rec.where()', но это, похоже, не работает ... –

 Смежные вопросы

  • Нет связанных вопросов^_^