如何从查找方法中排除 id 数组?
How to exclude an array of id's from a find-method?
我正在调用一系列推荐产品(基于 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
中排除产品。
我怎样才能让它工作,有什么想法吗?
最终代码:
根据 @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)
要查找 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_list
是 ActiveRecord::Relation
,您可以简单地完成:
some_list.where.not(user_id: current_user.id)
我正在调用一系列推荐产品(基于 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
中排除产品。
我怎样才能让它工作,有什么想法吗?
最终代码:
根据 @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)
要查找 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_list
是 ActiveRecord::Relation
,您可以简单地完成:
some_list.where.not(user_id: current_user.id)