2013-07-30 109 views
1

我正在尝试向销售应用程序(Ruby 2,Rails 4,Postgres)添加“自定义字段”。自定义字段实现

下面是相关的模式:

relevant database schema

什么是去实现这个的最佳方式? values是多态的,fieldsaccounts是一对多的。

有没有办法在字段上循环并获取关联的值?

回答

3

我可能会误解你的问题,但我认为Rails正在调用你的whatever-custom-field-label-is方法,因为它试图获取输入的初始值/默认值。

+0

我认为你是隔离的形式可能是对的。有关如何解决这个问题的建议,因为自定义字段不是直接属于'@ sale'(甚至是Sale模型)的一部分? – Dre

+0

@Dre你也许可以在默认值传递给'text_field'方法,避免了电话,但你可能会被重新架构你的看法使用演示/表单装饰(看看[改革]得到更好的服务(https://github.com/apotonick/reform))。 – coreyward

1

使用像text_field这样的助手要求对于名为的属性有一个getter方法。 Rails将使用它来预先填充字段。

跨越多个模型的内置方法是嵌套属性。

如果添加accepts_nested_attributes_for :values到你的销售模型,然后

= @sale.fields_for :values do |value_form| 
    = value_form.label :data, value_form.object.field.label 
    = value_form.text_field :data 

应呈现为每个值的标签和文本字段(块将产生一次为每个值)。

或者,您可以完全避开扶手。

如果相反,你把你的形式

= text_field_tag "sale[values_hash][#{v.field.label}]", v.data 

那么就应该在不改变模型渲染。当表格提交params[:sale][:values_hash]时,会将字段标签与输入值进行散列。您需要在您的模型values_hash=方法或保存会炸毁。如果你沿着这条路线继续下去,你会最终得到rails的嵌套属性,尽管这可能会给你更多的控制权。

还有其他的方法来复杂的轨道形式。一种方法是建立谁是编组持久性对象之间的数据负责,并有形成表现形式对象,无需知道该属性X被存储在一个单独的表和诸如此类的事情

+0

第二种方法适用于我,谢谢。但是我可能对我最初的问题说得不好。循环遍历字段并填充相关数据的最佳方法是什么?现在我遇到了问题,例如,一个新对象没有与它关联的“值”,并且什么都没有显示。 – Dre

+0

无论采用哪种方法,您都需要创建一些空的值,如果您想让它们的输入呈现 –

+0

这是否被认为是一种不好的做法?有没有办法做到这一点'null'值根本不被插入?这会导致重大的性能问题吗? – Dre