热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为哈希属性创建表单字段-Createformfieldsforhashattribute

IhaveamodelProduct,whichhasapropertiesattribute.Itstoresitinasingledatabasecolumna

I have a model Product, which has a properties attribute. It stores it in a single database column as a hash (following http://api.rubyonrails.org/classes/ActiveRecord/Store.html)

我有一个模型Product,它有一个属性属性。它将它作为哈希存储在单个数据库列中(在http://api.rubyonrails.org/classes/ActiveRecord/Store.html之后)

class Product 

How can I create dynamic form fields for this property attribute (which is a hash)? I'm interested in ideologically correct way of doing this ("rails way"). I guess that there is need to use fields_for helper. But I do not fully understand how to do it. Tell me the correct way of solving this problem, please.

如何为此属性属性(这是一个哈希)创建动态表单字段?我对意识形态正确的做法感兴趣(“轨道方式”)。我想有需要使用fields_for帮助器。但我不完全明白该怎么做。请告诉我解决这个问题的正确方法。

In result, I'd like to get a working form like shown on image.

结果,我想得到一个像图像所示的工作表格。

enter image description here

Where a user can add unlimited number of fields and give any property names and its values.

用户可以添加无限数量的字段并提供任何属性名称及其值。

3 个解决方案

#1


8  

The rails way needn't include the limitation of using a single table, ideally, you can do this in a very rails way with 2 tables. Moving on.

rails方式不需要包括使用单个表的限制,理想情况下,您可以使用2个表以非常有轨的方式执行此操作。继续。

You shouldn't use Active Record :store for this purpose in my opinion.

在我看来,您不应该使用Active Record:store来实现此目的。

That implementation is ideal for situations where the developers need to store model metadata that is flexible in-code but well-defined at any given point of time. Which is to say, you need to specify keys in the model.

对于开发人员需要存储灵活的代码但在任何给定时间点定义良好的模型元数据的情况,该实现非常理想。也就是说,您需要在模型中指定键。

There is another pit-fall, you can't run SQL queries on the resulting serialized text that is saved.

还有另一个陷阱,您无法对保存的结果序列化文本运行SQL查询。

If you insist, you can do this:

如果你坚持,你可以这样做:

In your model:

在你的模型中:

class Product 

In the view:

在视图中:

<%= form_for @product do |f| %>
  <% f.object.prop_hash.each do |k,v| %>
    <%= text_field 'product[prop_hash][][name]', k %>
    <%= text_field 'product[prop_hash][][value]', v %>
  <% end %>
<% end %>

Then you can also add an 'add another property' link which should use JS to insert another pair of inputs with the names product[prop_hash][][name] and product[prop_hash][][value] respectively.

然后你还可以添加一个'添加另一个属性'链接,该链接应该使用JS分别插入名为product [prop_hash] [] [name]和product [prop_hash] [] [value]的另一对输入。

Long ago I had rolled a custom implementation for metadata which saves the keys in serialized XML, for one reason - it can be queried in SQL. The link to my blog article http://geniitech.tumblr.com/post/14916592782/storing-metadata-as-xml-hash-in-ror

很久以前,我已经推出了元数据的自定义实现,它将密钥保存在序列化的XML中,原因之一是 - 它可以在SQL中查询。我的博客文章http://geniitech.tumblr.com/post/14916592782/storing-metadata-as-xml-hash-in-ror的链接

#2


1  

To be brief, you want to have a form that contains this within it somewhere:

简而言之,您希望在某个地方有一个包含此内容的表单:

<% @product.properties_hash.each do |k,v| %>
  <%= f.field_for k %>
  <%= f.field_for v %>
  <# link to action that will remove this key/value pair from the serialized hash saved in the database %>
<% end -%>

You're going to have to create a blank key and value pair somehow (either here in the form just using the form helpers or by adding a blank(ish) key and value pair to the end of the hash itself by modifying the product in the controller after you load it into @product (like with a @product.add_blank_properties method). Otherwise you won't have 'blank' fields at the end of the loop. . .

你将不得不以某种方式创建一个空白键和值对(在这里只是使用表单助手,或者通过在哈希本身的末尾添加一个空白(ish)键和值对来修改产品将控制器加载到@product后(就像使用@ product.add_blank_properties方法一样)。否则在循环结束时你不会有'空白'字段。

I could go into more detail about adding a new blank line for a property after you create one using the previously existing blank line, but by the time you get this far you should have a good grasp on what you need to look for to solve that (and there are plenty of resources out there (you will probably be using ajax for this).

在使用以前存在的空白行创建属性之后,我可以详细介绍如何为属性添加新的空白行,但是当你到达目前为止,你应该很好地掌握你需要寻找什么来解决这个问题。 (并且有很多资源(你可能会使用ajax)。

#3


-2  

I think you should be using rails standard scaffold but here you may need few customization's.

我认为你应该使用rails标准脚手架,但在这里你可能需要很少的定制。

1) Need to declare resourceful route for properties property name will become resource id 2) Index view will iterate over properties hash to populate relevant fields.

1)需要为属性声明资源路由属性名称将成为资源ID 2)索引视图将迭代属性哈希以填充相关字段。

product.properties.each do |name, value|
   puts name
   puts value
end

2) Create action should create a record if doesn't exist (based on name) already otherwise give an error

2)创建操作应该创建一个记录,如果不存在(基于名称)已经否则会给出错误

product.properties[:price] = 10

3) Update will find property based on name and update it hash way

3)更新将根据名称查找属性并更新其哈希方式

product.properties[:price] = 25

4) delete will actually delete the key-value pair from hash based on property name

4)delete实际上会根据属性名从哈希中删除键值对

product.properties.delete(:price)

推荐阅读
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • 本文介绍了如何使用 Gesture Detector 和 overridePendingTransition 方法来实现滑动界面和过渡动画。 ... [详细]
  • 本文介绍了 Oracle SQL 中的集合运算、子查询、数据处理、表的创建与管理等内容。包括查询部门号为10和20的员工信息、使用集合运算、子查询的注意事项、数据插入与删除、表的创建与修改等。 ... [详细]
  • PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • Java 中的等时日期(int,int)方法,示例 ... [详细]
  • h5调用本地摄像头和麦克风一
    h5调用本地摄像头和麦克风一,Go语言社区,Golang程序员人脉社 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 本文将深入探讨 iOS 中的 Grand Central Dispatch (GCD),并介绍如何利用 GCD 进行高效多线程编程。如果你对线程的基本概念还不熟悉,建议先阅读相关基础资料。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 在C#中开发MP3播放器时,我正在考虑如何高效存储元数据以便快速检索。选择合适的数据结构,如字典或数组,对于优化性能至关重要。字典能够提供快速的键值对查找,而数组则在连续存储和遍历方面表现优异。根据具体需求,合理选择数据结构将显著提升应用的响应速度和用户体验。 ... [详细]
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • iOS 百度地图使用指南:基本定位与地理编码
    本文详细介绍如何在 iOS 应用中集成百度地图,实现基本的地图定位和地理编码功能。配置详情请参考官方文档:http://developer.baidu.com/map/index.php?title=iossdk ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
author-avatar
单莼de笑脸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有