如何从find-method中排除id数组?

时间:2016-03-30 09:15:01

标签: arrays ruby-on-rails-4 conditional-statements recommendation-engine predictor-ruby-gem

我正在调用一系列推荐产品(基于predictor-gem),并希望从该集合中排除current_user的产品。我认为我正在使用(" != ?")的正确条件,但不是以正确的方式。 @products_rec应该给出最后一个数组。

这是我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中的产品。

我怎样才能让这个工作,任何想法?

最终代码: 根据{{​​1}}的答案,我已将以下工作代码添加到@Humza

product_controller.rb

1 个答案:

答案 0 :(得分:1)

要查找ID不在数组中的产品,您必须执行以下操作:

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)

修改

如果您希望基本产品来自其他列表,可以提供帮助:

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_listActiveRecord::Relation,您可以简单地完成:

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