0

TLDR:与此问题类似,尽管条件不是基于布尔属性,而是基于 aProductCategory对 a的所有权FormularProduct

我想要的group_method是,如果我硬编码值( ) formular_products.where(formular: @formular),什么效果很好,但我需要它是动态的@formularformular_products.where(formular: 1)


我有以下架构:

架构图

我正在尝试创建一个有条件的collection_select.

  1. 使用第一个选择形式(Formular,一个对象)。这使他导航到/formulars/:id/orders/new:他即将提交一个Order给选定的Formular
  2. 然后他必须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 中的函数,但遇到了与以前相同的问题。


所有这些失败和犹豫使我意识到我应该远离良好实践。你将如何解决这个问题?我觉得这个问题没有简单的解决方案,我不想修改我的架构(这有点麻烦,但这是另一个问题)

感谢您的时间和抱歉我对我们心爱的框架和近似英语的理解不足

4

0 回答 0