【发布时间】:2017-07-21 05:35:02
【问题描述】:
我有一个Home 模型,其中包含主页内容,例如intro_copy、about_image 和about_copy。
在Home 模型上,我还希望能够使用has_one 关系展示我的Post 模型中的3 个帖子。基本上只是使用 id 链接它们。
我的Home 架构如下所示:
schema "home" do
field :intro_copy, :string
field :about_copy, :string
field :about_image, Image.Type
has_one :post_1, Post
has_one :post_2, Post
has_one :post_3, Post
timestamps()
end
我的changeset 函数如下所示:
def changeset(struct, params \\ %{}) do
struct
|> cast_assoc(params, [:post_1, :post_2, :post_3])
|> cast(params, @required_fields, @optional_fields)
end
另外,在我的迁移中,我在:home 表中添加了以下几行:
add :post_1_id, references(:posts)
add :post_2_id, references(:posts)
add :post_3_id, references(:posts)
这里有什么地方我明显出错了吗?
【问题讨论】:
-
如果
homes表包含对posts的引用,那么Home应该belong_to发布。has_one是相反的。belongs_to不适合你吗? -
我不确定我是否做得最好。我基本上只是想要一种能够在
Home模型上发布 3 个精选帖子的方法。Home模型也是单例。 -
是的,belongs_to 非常适合。
has_*关系适用于另一个表具有引用字段的情况。belongs_to是当前表具有引用字段时。 -
我应该对上面的
home架构进行哪些更改?我有点困惑post_1、post_2是否应该还在里面。 -
删除
has_one :post_1, Post并改为添加belongs_to :post_1, Post。这应该可以工作,因为数据库中的外键是:post_1_id。
标签: phoenix-framework ecto elixir