从数据库字段的值中下拉
Dropdown from values of a database field
我有一个与数据过滤相关的问题。我有一个 Google 驱动器 table 来存储数据,我想在下拉列表中显示此数据源的一个字段以按此字段(国家/地区)进行筛选。
问题在于此下拉过滤器仅显示出现在列表当前页面上的国家/地区。例如,如果在第一页的下拉列表中出现一个国家(泰国),我只会看到泰国。
如果我们转到列表的第二页,我们会看到另外两个国家(西班牙和葡萄牙),然后下拉列表将只显示西班牙和葡萄牙。
我真正想要的是一个显示所有国家/地区的下拉列表,无论它们是否不在当前页面上,但我不知道如何修复它。
这是国家选择器的配置:
帮助里说要用@datasource.model.fields.COUNTRY.possibleValues
,
但是如果我将此参数用作选项,则选择器中不会显示任何内容。
我花了很多时间试图解决这个问题,但我没有找到解决方案,我想与您确认这是一个问题还是我做错了什么...
你能帮帮我吗?
您为下拉列表和 table 使用相同的数据源,并且 #distinct()#sort()
您正在过滤已经加载到浏览器的项目(与存储在数据库中的整个数据集相反)。
您的下拉列表需要一个单独的数据源。至少有三种技术可以做到这一点:
可能的值
您可以为 Country
字段预定义 allowed values 并使用它们填充创建表单和 table 过滤 @datasource.model.fields.Country.possibleValues
中的下拉选项,如您在问题中提到的:
为国家/地区创建模型
通过为国家/地区引入专用 related model,您可以获得以下好处:
- 标准化数据(您不会多次存储同一个国家)
- 您将能够保持您的国家/地区列表整洁(使用当前方法,可能会有相同国家/地区的不同拼写,例如 'US'、'USA'、'United State'、等等)
- 应用程序用户在创建新记录时将能够从下拉列表中选择他们需要的国家(而不是每次为所有新记录都输入容易出错的国家)。
- 您的下拉绑定将像这些一样简单:
// for names
@datasources.Countries.items..Names
// for options
@datasources.Countries.items.._key
// for value
@datasource.query.filters.Country._key._equals
创建计算模型
使用 Calculated Model,您将能够从 table 中提取独特的国家/地区值。您的服务器查询脚本可能类似于以下内容:
function getUniqueCountries_() {
var consumptions = app.models.Consumption.newQuery().run();
var countries = [];
consumptions.reduce(function (allCountries, consumption) {
if (!allCountries[consumption.Country]) {
var country = app.models.CountryCalc.newRecord();
country.Name = consumption.Country;
countries.push(country);
allCountries[consumption.Country] = true;
}
}, {});
return countries;
}
然而,随着消费的增长table,它会给您带来显着的性能开销。在这种情况下,我宁愿研究 Cloud SQL and Calculated SQL model.
的方向
注:
我给出了一个相当广泛的答案,它也涵盖了字段选项数量可以不受限制(相对于有限的国家/地区数量)的类似情况。
我有一个与数据过滤相关的问题。我有一个 Google 驱动器 table 来存储数据,我想在下拉列表中显示此数据源的一个字段以按此字段(国家/地区)进行筛选。
问题在于此下拉过滤器仅显示出现在列表当前页面上的国家/地区。例如,如果在第一页的下拉列表中出现一个国家(泰国),我只会看到泰国。
如果我们转到列表的第二页,我们会看到另外两个国家(西班牙和葡萄牙),然后下拉列表将只显示西班牙和葡萄牙。 我真正想要的是一个显示所有国家/地区的下拉列表,无论它们是否不在当前页面上,但我不知道如何修复它。
这是国家选择器的配置:
帮助里说要用@datasource.model.fields.COUNTRY.possibleValues
,
但是如果我将此参数用作选项,则选择器中不会显示任何内容。
我花了很多时间试图解决这个问题,但我没有找到解决方案,我想与您确认这是一个问题还是我做错了什么...
你能帮帮我吗?
您为下拉列表和 table 使用相同的数据源,并且 #distinct()#sort()
您正在过滤已经加载到浏览器的项目(与存储在数据库中的整个数据集相反)。
您的下拉列表需要一个单独的数据源。至少有三种技术可以做到这一点:
可能的值
您可以为 Country
字段预定义 allowed values 并使用它们填充创建表单和 table 过滤 @datasource.model.fields.Country.possibleValues
中的下拉选项,如您在问题中提到的:
为国家/地区创建模型
通过为国家/地区引入专用 related model,您可以获得以下好处:
- 标准化数据(您不会多次存储同一个国家)
- 您将能够保持您的国家/地区列表整洁(使用当前方法,可能会有相同国家/地区的不同拼写,例如 'US'、'USA'、'United State'、等等)
- 应用程序用户在创建新记录时将能够从下拉列表中选择他们需要的国家(而不是每次为所有新记录都输入容易出错的国家)。
- 您的下拉绑定将像这些一样简单:
// for names
@datasources.Countries.items..Names
// for options
@datasources.Countries.items.._key
// for value
@datasource.query.filters.Country._key._equals
创建计算模型
使用 Calculated Model,您将能够从 table 中提取独特的国家/地区值。您的服务器查询脚本可能类似于以下内容:
function getUniqueCountries_() {
var consumptions = app.models.Consumption.newQuery().run();
var countries = [];
consumptions.reduce(function (allCountries, consumption) {
if (!allCountries[consumption.Country]) {
var country = app.models.CountryCalc.newRecord();
country.Name = consumption.Country;
countries.push(country);
allCountries[consumption.Country] = true;
}
}, {});
return countries;
}
然而,随着消费的增长table,它会给您带来显着的性能开销。在这种情况下,我宁愿研究 Cloud SQL and Calculated SQL model.
的方向注:
我给出了一个相当广泛的答案,它也涵盖了字段选项数量可以不受限制(相对于有限的国家/地区数量)的类似情况。