修改Phoenix中的结构列表

时间:2017-04-26 04:40:12

标签: elixir phoenix-framework ecto changeset

我有一个博客,后端显示帖子列表。每个帖子都有publish_on值,这是一个日期时间 - 如果当前时间晚于publish_on,则帖子处于活动状态(Post有一个名为active的布尔虚拟字段)。

当我向Repo查询帖子列表时,我想查看列表,如果当前时间在{{1}之后,请将帖子的active设置为true }。

什么是最多" Elixirian"这样做的方法? (另外,Elixir社区" Pythonic"是什么版本?)

模型/ post.ex

publish_on

控制器/ post_controller.ex

defmodule MyApp.Post do
  use MyApp.Web, :model

  schema "posts" do
    field :title, :string
    field :content, :text
    field :publish_on, Ecto.DateTime
    field :active, :boolean, virtual: true, default: false

    timestamps()
  end

模板/后/ index.html.eex

MyApp.PostController
  def index(conn, _params) do
    query = from p in Post,
    posts = Repo.all(query)

    ###I assume some kind of mapping goes here

    render(conn, "index.html", posts: posts)
  end

2 个答案:

答案 0 :(得分:2)

我使用for查看帖子,使用DateTime.utc_nowpost.publish_onDateTime.compare进行比较,如果是:gt ,将active设为true

posts = Repo.all(query)

now = DateTime.utc_now

posts = for post <- posts do
  case DateTime.compare(now, post.publish_on) do
    :gt -> %{post | active: true}
    _ -> post
  end
end

答案 1 :(得分:2)

您可以在查询中初始化虚拟字段:

query = from p in Post, select: %{p | active: (s.publish_on < ^DateTime.utc_now())}
posts = Repo.all(query)