我想为每个类别添加一个样本产品和产品计数。
schema "category" do
timestamps()
field :title, :string
has_many :products, Product
end
result: %{title: “…”, sample_product: %Product{…}, products_count: xx}
是否可以使用ecto和postgresql?
答案 0 :(得分:0)
是的,这是可能的。
对于示例产品,您应该在sample_product_id
表格中有另一个密钥(categories
)和belongs_to
架构中的Category
字段。
Ecto中没有内置的计数器缓存解决方案,但可以使用Postgres触发器和read_after_writes option to a schema field轻松实现。
答案 1 :(得分:0)
我不会提供一个随时可用的答案,但也许这可以作为一个很好的起点。我将从构建执行它的SQL查询开始,因为一旦看到它正常工作,您就可以轻松地将其转换为Ecto。
问题的第一部分是找到相关产品的数量。这可以按如下方式完成:
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;
第二部分是为每个类别附加随机产品。我不知道在一个查询中执行此操作的方法,您可能已使用嵌套的SELECT完成此操作,但性能会非常值得怀疑,因此我建议您进行另一个查询,这会将类别ID视为参数:
SELECT DISTINCT(p.category_id)* FROM products AS p WHERE p.category_id IN(...)ORDER BY p.category_id,RANDOM();
现在你只需要用Ecto重写它。如果您需要帮助,请告诉我。