获取计数和一个与Ecto的has_many关系样本

时间:2017-10-19 17:12:16

标签: elixir ecto

我想为每个类别添加一个样本产品和产品计数。

schema "category" do
  timestamps()
  field :title, :string
  has_many :products, Product
end

result: %{title: “…”, sample_product: %Product{…}, products_count: xx}

是否可以使用ecto和postgresql?

2 个答案:

答案 0 :(得分:0)

是的,这是可能的。

对于示例产品,您应该在sample_product_id表格中有另一个密钥(categories)和belongs_to架构中的Category字段。

Ecto中没有内置的计数器缓存解决方案,但可以使用Postgres触发器和read_after_writes option to a schema field轻松实现。

答案 1 :(得分:0)

我不会提供一个随时可用的答案,但也许这可以作为一个很好的起点。我将从构建执行它的SQL查询开始,因为一旦看到它正常工作,您就可以轻松地将其转换为Ecto。

  1. 问题的第一部分是找到相关产品的数量。这可以按如下方式完成:

    SELECT c.title,count(p.id)AS products_count FROM categories AS c JOIN products AS p ON p.category_id = c.id GROUP BY c.id;

  2. 第二部分是为每个类别附加随机产品。我不知道在一个查询中执行此操作的方法,您可能已使用嵌套的SELECT完成此操作,但性能会非常值得怀疑,因此我建议您进行另一个查询,这会将类别ID视为参数:

    SELECT DISTINCT(p.category_id)* FROM products AS p WHERE p.category_id IN(...)ORDER BY p.category_id,RANDOM();

  3. 现在你只需要用Ecto重写它。如果您需要帮助,请告诉我。