在我的应用程序中,用户描述建筑物。用户应该能够使用分组选择来指定建筑物存在于哪个邻域中。模型看起来像:
class Building
include Mongoid::Document
belongs_to :neighborhood
end
class Neighborhood
include Mongoid::Document
field :name, type: String, default: nil
field :borough, type: String, default: nil
field :city, type: String, default: nil
end
使用simple_form,我正在尝试生成一个分组选择,表示建筑可能属于的邻域列表。
= building_form.association :neighborhood, as: :grouped_select, collection: Neighborhood.where(city: city), group_method: :borough
理想情况下,可以创建类似的内容:
Borough #1
Downtown
Uptown
Borough #2
Suburbs
...
然而,我收到此错误:
undefined method `map' for "Borough #1":String
它似乎正在调用Neighborhood.borough.map
,并且因为String没有map
函数,所以它会出错。我该如何解决这个问题?
答案 0 :(得分:7)
我已经挣扎了一段时间了,不幸的是,我希望从association
得到的直观的“Rails”魔法似乎并不存在。它正在使用底层的Rails grouped_collection_select
,它似乎不能很好地处理对象/模型。
相反,它似乎更好地处理数组。根据{{3}},集合输入应采用以下形式:
[
['group_name',
[
['item-name','item-value'],
['item2-name','item2-value'],
...(more items)...
]
],
['group2_name',
[
['item3-name','item3-value'],
['item4-name','item4-value'],
...(more items)...
]
],
...(more groups)...
]
MongoDB模型自然不适合这种格式,所以我在Neighborhood
类上编写了一个帮助方法:
def self.grouped_by_borough(city)
groups = []
Neighborhood.where(city: city).distinct(:borough).each_with_index do |borough, index|
groups << [borough, Neighborhood.where(city: city, borough: borough)]
end
return groups
end
然后我的association
看起来像:
= building_form.association :neighborhood, as: :grouped_select, collection: Neighborhood.grouped_by_borough(city), group_method: :last, option_key_method: :name, option_value_method: :id
这也会自动选择任何先前选择的邻域,这样便于“编辑”表单。
如果有任何Rails表格/ Mongoid大师有更清晰的方式处理这个问题,我很乐意听到它。