Rails' acts_as_list 的 Ecto 等价物?
Ecto equivalent for Rails' acts_as_list?
对于 Rails,有优秀的 acts_as_list gem,它允许定义由 position
整数字段排序的关联。 Ecto 和 Phoenix 是否有类似的库,或者 Ecto 自己是否实现了类似的东西?
看起来有一个小的 Ecto 扩展可以提供帮助:https://github.com/zovafit/ecto-ordered
虽然(至少是订购部分)这可以很容易地仅使用一些 Ecto 基础知识来完成:
web/models/invoice.ex
defmodule MyApp.Invoice do
use MyApp.Web, :model
schema "invoices" do
has_many :line_items, MyApp.LineItem
timestamps
end
# ...
end
web/models/line_item.ex
defmodule MyApp.LineItem do
use MyApp.Web, :model
schema "line_items" do
belongs_to :invoice, MyApp.Invoice
field :position, :integer
timestamps
end
def positioned do
from l in __MODULE__,
order_by: [asc: l.position]
end
# ...
end
然后你可以像这样查询你定位的项目:
Repo.all(MyApp.LineItem.positioned)
或者像这样预加载它们:
Repo.get(MyApp.Invoice, id) |> Repo.preload(line_items: MyApp.LineItem.positioned)
您可以在此处阅读有关将范围或条件包含到 Ecto.Schema.has_many/3
中的一些上下文:https://github.com/elixir-lang/ecto/issues/659
对于 Rails,有优秀的 acts_as_list gem,它允许定义由 position
整数字段排序的关联。 Ecto 和 Phoenix 是否有类似的库,或者 Ecto 自己是否实现了类似的东西?
看起来有一个小的 Ecto 扩展可以提供帮助:https://github.com/zovafit/ecto-ordered
虽然(至少是订购部分)这可以很容易地仅使用一些 Ecto 基础知识来完成:
web/models/invoice.ex
defmodule MyApp.Invoice do
use MyApp.Web, :model
schema "invoices" do
has_many :line_items, MyApp.LineItem
timestamps
end
# ...
end
web/models/line_item.ex
defmodule MyApp.LineItem do
use MyApp.Web, :model
schema "line_items" do
belongs_to :invoice, MyApp.Invoice
field :position, :integer
timestamps
end
def positioned do
from l in __MODULE__,
order_by: [asc: l.position]
end
# ...
end
然后你可以像这样查询你定位的项目:
Repo.all(MyApp.LineItem.positioned)
或者像这样预加载它们:
Repo.get(MyApp.Invoice, id) |> Repo.preload(line_items: MyApp.LineItem.positioned)
您可以在此处阅读有关将范围或条件包含到 Ecto.Schema.has_many/3
中的一些上下文:https://github.com/elixir-lang/ecto/issues/659