如何优雅地为具有多态关联的模型构建表单?

2024-01-28

这是我的模型:

class Lesson < ActiveRecord::Base
  belongs_to :topic, :polymorphic => true  
  validates_presence_of :topic_type, :topic_id  
end

class Subject < ActiveRecord::Base  
   has_many :lessons, :as => :topic  
end

class Category < ActiveRecord::Base  
  has_many :lessons, :as => :topic  
end

现在,我需要的是一个允许用户创建或更新课程的表单。问题是,我如何提供一个包含主题和类别组合的精选菜单? (对于用户来说,在这个特定的表单上,主题和类别是可以互换的,但在其他地方情况并非如此。)

理想情况下,这看起来像这样:

视图/课程/_form.html.haml

= simple_form_for(@lesson) do |f|
  = f.input :title
  = f.association :topic, :collection => (@subjects + @categories)

这是行不通的,因为我们只指定 topic_id,并且我们还需要 topic_types。但我们如何指定这些值呢?

我想问题的关键是我真的想要一个单一的选择菜单来指定与两个不同属性(topic_id 和 topic_type)相对应的两个值。有没有优雅的railsy方式来做到这一点?

一些注意事项:

a)单表继承将使这个问题消失,但我想避免这种情况,因为类别和主题有自己的关系......我将不告诉你细节。

b) 我可能会搞一些 JavaScript 恶作剧,是吗?但这听起来很混乱,如果有更干净的方法来做到这一点,一些魔法形式的帮助者或其他东西,那么这当然是更好的选择。

c) 虽然我使用的是 simple_form,但我并不热衷于它,以防事情变得复杂。

Thanks


如果您不想使用 STI,您可以执行类似的操作:创建一个新模型Topic(name:string)这将多态引用Subject or Category.

class Lesson < ActiveRecord::Base
  belongs_to :topic
  validates_presence_of :topic_id  
end

class Topic < ActiveRecord::Base
  belongs_to :topicable, :polymorphic => true
end

class Subject < ActiveRecord::Base
   has_one :topic, :as => :topicable
   has_many :lessons, :through => :topic
   accepts_nested_attributes_for :topic
end

class Category < ActiveRecord::Base  
   has_one :topic, :as => :topicable
   has_many :lessons, :through => :topic
   accepts_nested_attributes_for :topic
end

在创建新主题/类别的视图中:

<%= form_for @subject do |subject_form| %>
  <%= subject_form.fields_for :topic do |topic_fields| %>
    <%= topic_fields.text_field :name %>
  <% end %>
<% end %>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何优雅地为具有多态关联的模型构建表单? 的相关文章

随机推荐

  • r中的2d矩阵到3d堆叠数组

    我有一个数据框data在 R 中 大小为 120000 行 x 5 列 每300行是在不同时间间隔测量的一帧 即400帧 Action 我尝试使用array data c 300 5 400 Expected 通过分割将此数据框变成 3d
  • 如何正确处理类中使用的字节数组?

    我有一个 StateObject 类 用于存储来自客户端和服务器的数据 这是代码 public class StateObject IDisposable public StateObject public String serviceNa
  • iPhone 自动对焦中到“兴趣点”的距离

    在iphone中 我想计算相机到拍摄对象的距离 我想知道也许 iPhone 相机的 主动自动对焦 为我提供了到拍摄对象 兴趣点 的距离 提前谢谢了 附注伙计们 如果您认为不可能 请告诉我 据我所知 这是不可能的 请参阅here http d
  • Pyside6:从 QTableWidget 复制粘贴、删除、撤消多个单元格

    我希望能够使用 control C control V 在 Pyside6 表 QTableWidget 之间进行复制和粘贴 主要是在 Excel 之间进行复制和粘贴 我找到了 Momo 2023 年 1 月的帖子 1 https stac
  • JavaScript 闭包。在循环中访问当前 i、j 变量[重复]

    这个问题在这里已经有答案了 我尝试动态生成 table 使用 jQuery 我想为每个单元格设置单击处理程序 因此当单元格单击时 弹出窗口将显示单元格的当前索引 我如何访问 CURRENTi and j循环中的变量 for var i 0
  • 如何使用不同的服务帐户凭据验证谷歌API?

    任何曾经不幸以编程方式与 Google CLI 二进制文件进行交互的人都会意识到 可以使用以下工具进行身份验证gcloud gsutil bq等远非直观或琐碎 尤其当您需要跨不同项目工作时 我正在为不同的项目运行与 Google Cloud
  • 在 Ubuntu Linux 上安装功能齐全的 PostGIS 2.0 GEOS/GDAL 问题

    我一直致力于在 ubuntu maverick amd64 Linux 服务器上启动并运行 postgis 2 0 大约一周 我正在寻求栅格和拓扑支持 我使用以下内容进行配置 sudo configure with raster with
  • JAXB RI ClassFactory 中的空指针异常

    Intro 我和我的朋友正在开发一个 JavaFX 应用程序 该应用程序充当我们学校的规划器 我们有任务 课程作业 活动 课程和学生信息 为了将数据持久存储在用户的硬盘上 我们使用了 JAXB 我们已经注释了我们的类 并且可以成功地将 Ta
  • 使用 Flexbox 具有相同高度元素的多行网格

    我正在尝试创建一个具有多行和多列的网格 我希望使用 Flexbox 使它们都具有相同的高度 但我唯一能得到的是一行上具有相同大小的列 这是我正在尝试做的事情的一个例子 http jsbin com maxavahesa 1 edit htm
  • 如何在 OSX 上替换 Python 中的“关于 Tkinter”菜单

    编辑 我指的是 OSX 应用程序菜单 其中包含 关于 和 首选项 菜单项 以及其他菜单项 对于知道正确搜索词的人来说 也许这将是另一个简单的过程 但是在花费数小时在 IDLE 中跟踪代码并搜索网络之后 我还没有完全能够将这些点联系起来 我正
  • 以编程方式从 DataTable 创建 DataGridview

    我有以下代码 DataTable table new DataTable DataTable is filled with values here DataGridView grid new DataGridView foreach Dat
  • Javascript charAt() 打破多字节字符串

    此代码在 Nodejs v0 10 21 中崩溃 usr bin env node use strict var urlEncoded http zh wikipedia org wiki F0 A8 A8 8F var urlDecode
  • Python请求,如何将内容类型添加到multipart/form-data请求

    我使用 python requests 通过 PUT 方法上传文件 远程 API 仅当正文包含属性时才接受任何请求 Content Type i mage png 不作为请求标头 当我使用 python requests 时 请求因缺少属性
  • 迭代器性能

    与直接使用指针相比 实现和使用迭代器是否会带来任何类型的性能损失 假设我们使用最高的编译器优化 代码来自http www cplusplus com reference iterator iterator http www cplusplu
  • 迭代器实现应该如何处理检查异常?

    我将 java sql RecordSet 包装在 java util Iterator 中 我的问题是 如果任何记录集方法抛出 SQLException 我该怎么办 The java util Iterator javadoc http
  • 如何在eclipse中运行maven项目

    我有一个带有 TestNG 的 Java Maven 项目 我想从 eclipse 运行它 我使用 Eclipse Kepler 并安装了 m2eclipse 插件 但是菜单 Run as 中没有任何与 maven 连接的选项 有人可以帮我
  • 当我单击“确定”按钮时,Android AlertDialog 总是退出

    有没有办法在单击 确定 后进行验证 我没有忽略它 但当我单击 确定 时它会关闭 我编写了一个使用一些编辑文本的自定义 AlertDialog 问题是我无法验证任何内容 如果验证失败 我想更改消息并告诉用户 但它只是关闭 我正在使用Alert
  • Blazor 服务器应用程序中的 HttpContext.Session

    我正在尝试使用HttpContext Session在我的 ASP NET Core Blazor Server 应用程序中 如此处所述MS Doc https learn microsoft com en us aspnet core f
  • TCPDF:将文本剪切到单元格宽度

    我正在广泛使用 TCPDF 的 Cell 方法生成 PDF 报告 使用 Cell 方法打印的文本超出了方法中指定的宽度 我只想打印适合指定宽度的文本部分 但不要溢出或换行到下一行 我不想要字体拉伸策略 我搜索了很多但找不到解决方案 还有其他
  • 如何优雅地为具有多态关联的模型构建表单?

    这是我的模型 class Lesson lt ActiveRecord Base belongs to topic polymorphic gt true validates presence of topic type topic id