TLDR:与此问题类似,尽管条件不是基于布尔属性,而是基于 aProductCategory
对 a的所有权FormularProduct
我想要的group_method
是,如果我硬编码值( ) formular_products.where(formular: @formular)
,什么效果很好,但我需要它是动态的@formular
formular_products.where(formular: 1)
我有以下架构:
我正在尝试创建一个有条件的collection_select
.
- 使用第一个选择形式(
Formular
,一个对象)。这使他导航到/formulars/:id/orders/new
:他即将提交一个Order
给选定的Formular
- 然后他必须
ProductCategory
从 acollection_select
中选择一个,然后选择一个Product
既属于先前选择的类别,又属于当前的Formular
。
我面临的困难是,只有当它们属于这个公式时,我才能根据它们的类别对产品进行分组。按类别对它们进行分组并不是什么大问题,尽管过滤属于当前公式的那些并不容易。
第一次尝试:来自API 码头pepe_hipolito 说:
“
group_method
参数可以是表示方法链的字符串”
这看起来完全像我需要的:
<%= f.grouped_collection_select :product_id, # method
ProductCategory.order(:name), # collection
'formular_products.where(formular: @formular)', # group_method
:name, # group_label_method
:id, # option_key_method
:name %> # option_value_method
但返回 NoMethoderror undefined method 'formular_products.where(formular: @formular)' for #<ProductCategory:0x00007f21e17e48c0>
,尽管它在控制台中按预期工作。如果我决定不作为参数传递@formular
而是在内部调用它products_belonging_to_current_formular
,它的值为nil
. (为什么我不能在这个上下文中访问实例变量?我在调用该方法的视图中使用它)
第二次尝试:文档还说
group_label_method
[...] 它也可以是响应调用的任何对象,例如 proc,将为集合的每个成员调用以检索标签。
但我对 Proc 用法缺乏了解限制了我(通过Proc.new { formular_products.where(formular: @formular) }
没有工作)
其他尝试:我正在考虑在ProductCategory
模型中创建一个方法来检索产品,但是,我如何识别当前的公式(模型中无法访问参数)。我尝试@formular
使用字符串(pepe_hipolito 提示)将参数作为参数传递给 FormularProduct 中的函数,但遇到了与以前相同的问题。
所有这些失败和犹豫使我意识到我应该远离良好实践。你将如何解决这个问题?我觉得这个问题没有简单的解决方案,我不想修改我的架构(这有点麻烦,但这是另一个问题)
感谢您的时间和抱歉我对我们心爱的框架和近似英语的理解不足