获取搜索产品搜索结果的用户

时间:2017-08-02 17:15:45

标签: sql ruby-on-rails ruby postgresql activerecord

我知道让所有拥有搜索结果产品的用户的最佳方式

我的控制器

WITH StateTransitions AS (
SELECT *
    FROM (
        VALUES
         ('x','p', 'A'),
         ('x','q', 'B'),
         ('x','r', 'A'),
         ('x','s', 'B'),
         ('x','t', 'A'),

         ('y','p', 'A'),
         ('y','q', 'A'),
         ('y','r', 'B'),
         ('y','s', 'B'),
         ('y','t', 'B'),

         ('z','p', 'C'),
         ('z','q', 'B'),
         ('z','r', 'A'),
         ('z','s', 'A'),
         ('z','t', 'B'),

    ) AS TableLiteral(Foo, Bar, Category)
),
rest of query.

我的观点

    @users = User.all // i must change here ?
    if params[:product_type].present? && params[:location].present? && params[:discount].present?
      @products = Product.near(params[:location], 1, units: :km).where(product_type: params[:product_type], discount: params[:discount])
    end

我的方法有效,但如果一家公司有2个产品,它会显示2次

2 个答案:

答案 0 :(得分:1)

假设如下:

User has_many :products
Product belongs_to :user

你可以这样做:

@users_from_product_results = User.where(id: @products.pluck(:user_id))

如果多个产品引用同一个用户,则此用户只会列出一次。

答案 1 :(得分:0)

不是进行2次单独的AR调用,而是使用包含(eager_loading),它在单个查询中同时提供产品和用户。

if params[:product_type].present? && params[:location].present? && params[:discount].present?
  @products = Product.near(params[:location], 1, units: :km).where(product_type: params[:product_type], discount: params[:discount])
.includes(:user)
end

在视图中,您可以使用@products.map(:users).uniq来提供与产品相关联的所有用户。