【问题标题】:Ecto has_one without belongs_to in Phoenix凤凰城没有belongs_to的Ecto has_one
【发布时间】:2017-07-21 05:35:02
【问题描述】:

我有一个Home 模型,其中包含主页内容,例如intro_copyabout_imageabout_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_1post_2 是否应该还在里面。
  • 删除 has_one :post_1, Post 并改为添加 belongs_to :post_1, Post。这应该可以工作,因为数据库中的外键是:post_1_id

标签: phoenix-framework ecto elixir


【解决方案1】:

如果home 表包含对posts 的引用,那么Home 应该是belongs_to Posthas_one 是相反的——如果posts 包含一个引用home 的字段,您将在此处使用它。

如果你改变:

has_one :post_1, Post
has_one :post_2, Post
has_one :post_3, Post

belongs_to :post_1, Post
belongs_to :post_2, Post
belongs_to :post_3, Post

一切都应该适用于您已经编写的迁移。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-03
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    相关资源
    最近更新 更多