从id' s中选择,包括

时间:2015-10-28 18:47:20

标签: ruby-on-rails ruby postgresql

不确定如何解决我在选择个人时遇到的问题 来自数组的id。

我有商店,产品和价格的模型。商店有很多 (has_many)产品,产品每个商店有一个(has_one)价格。 我用CSV数据为数据库播种。我的应用程序主要仅用作API。

Price.csv(其中带有ID的产品:7和8都具有相同的价格 商店3)中的4.25美元:

amount,product_id,store_id
"3.49","{6}","3"
"4.25","{7,8}","3"

create_prices.rb:

create_table :prices do |t|
...
     t.integer :product_id, array: true, default: []
... etc
end

当我尝试包含价格时,问题出现在我的查询中 协会,我收到一个错误说明:

ActiveRecord::StatementInvalid
(PG::UndefinedFunction: ERROR:  operator does not exist: integer[] =
integer LINE 1: ...LEFT OUTER JOIN "prices" ON "prices"."product_id" =
"product...

我认为这个问题与价格未正确处理数组的价格包含有关?

产品控制器:

class API::ProductsController < ApplicationController
@products = Product.where("products.store_id @> '{?}'", params[:id].to_i).includes(:price).where('prices.store_id = ?', params[:id]).references(:prices).limit(params[:max])
end

Product.rb型号:

class Product < ActiveRecord::Base
    belongs_to :store
  has_one :price

def as_json(options)
    super(:only => [:id, :name, :description, :image, :weight, :store_id],
      :include => {
            :price => {:only => [:amount, :store_id]}
          }
    )
  end
end

1 个答案:

答案 0 :(得分:0)

不要将数组数据类型用于price_id的价格,只需使用整数并为每个商店/产品组合分别记录

然后尝试使用has_one通过价格

class Product < ActiveRecord::Base
  belongs_to :store
  has_one :price, through: :store

在您的控制器中尝试预加载而不是包含,这应该生成2个查询,一个用于产品,一个用于具有正确where子句的价格

@products = Product.where(store_id: params[:id]).preload(:price)