gpt4 book ai didi

ruby-on-rails - rails : Dynamically selecting an attribute for comparison

转载 作者:数据小太阳 更新时间:2023-10-29 09:03:36 25 4
gpt4 key购买 nike

我有一个包含不同食物菜单的数据库,我正在尝试搜索这些菜单。总的来说一切正常,但我认为与我现在正在做的相比,一定有更聪明的方法来编写代码。

每个菜单都有一组描述厨房类型的 bool 属性(例如 cuisine_thai、cuisine_italian 等)。在我看来,我有一个下拉菜单,允许用户选择他想要的食物类型,然后我传递参数并将其保存在我的搜索对象中。

@search.cuisine_type = params[:cuisine_type]

然后我继续检查不同的厨房类型,看看是否匹配。

#Filter for Thai cuisine
if(@search.cuisine_type == "cuisine_thai")
@menus = @menus.select{ |menu| menu.cuisine_thai == true}
end
#Filter for French cuisine
if(@search.cuisine_type == "cuisine_italian")
@menus = @menus.select{ |menu| menu.cuisine_italian == true}
end
#Filter for Peruvian cuisine
if(@search.cuisine_type == "cuisine_peruvian")
@menus = @menus.select{ |menu| menu.cuisine_peruvian == true}
end

尽管我的方法行得通,但一定有更好的方法来做到这一点。我觉得存储在@search.cuisine_type 中的值可以确定我在@menus 上检查的属性。

非常感谢对此的任何帮助。谢谢!

最佳答案

是的,你的直觉是正确的!

我假设 @menus 是一个数组,是 ActiveRecord Menu 对象,并且 cuisine_* 属性对应于数据库列。在这种情况下,您可以使用 ActiveRecord 的 attributes 方法。

每个 ActiveRecord 对象都有一个 attributes 属性。文档(Rails 4.2.1)说:

attributes() Returns a hash of all the attributes with their names as keys and the values of the attributes as values.

为了验证这种情况,如果您查看给定菜单的 attributes,您应该会看到一个散列,其中包含:

{
"cuisine_italian" => true,
"cuisine_thai" => false,
# etc.
}

此外,作为代码可读性的次要点,这两个语句实际上是相同的:

@menus = @menus.select { ... }
@menus.select! { ... }

因此,您的搜索可以重写为:

if @search.cuisine_type.present?
@menus.select! { |m| m.attributes[@search.cuisine_type] }
end

关于ruby-on-rails - rails : Dynamically selecting an attribute for comparison,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29330763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com