在一种情况下,我正在专门寻找值为String
的{{1}}。简而言之,如果用户在下拉菜单中选择了该选项而不传递"nil"
,那么我就有条件要传递nil
,这是在参数中传递的内容:
我的选择:
"nil"
我的状况:
<select name="parent_id">
<option name="All">All</option>
<option name="None" value="nil">None</option>
</select>
通常,您将在if params[ :parent_id ].present?
Child.where( parent_id: params[ :parent_id ] ) # I want this to be IS NULL when params[ :parent_id ] == "nil"
end
上使用.nil?
或.blank?
来检查String
的值或空的nil
。但是String
和"nil".nil?
都应该等于"nil".blank?
。
因此,我很好奇是否存在一种检查false
是否为String
的好方法。
当前我正在使用"nil"
,但这会导致类似myString == "nil"
的情况。
( myString == "nil" ? nil : myString )
偶尔使用它是很好的,但是如果经常使用它,那是不理想的。
我知道这种情况很少见,但是对于Google来说特别困难,所以我想问一下。
我最初的想法是:
if params[ :parent_id ].present?
parent_id = params[ :parent_id ] == "nil" ? nil : params[ :parent_id ]
Child.where( parent_id: parent_id )
end
添加方法,以便您可以执行类似String
的操作。"nil".nil_literal? #=> true
,以便.presence?
返回"nil".presence?
而不是nil
。答案 0 :(得分:1)
我建议将选择内容更改为:
<option name="None" value="">None</option>
如果您做不到,我将不给猴子打补丁。
您可以在条件中添加"nil"
检查:
if params[ :parent_id ].present? && params[ :parent_id != 'nil'
Child.where(parent_id: params[:parent_id]))
end
或者您可以使用单独的方法过滤params
:
def filtered_params
@filtered_params |= params.tap{|p| p[:parent_id] = nil if p[:parent_id] == 'nil' }
end
并在控制器代码中使用filtered_params
代替params
。
答案 1 :(得分:0)
这就是我要解决的方法
class Child
belongs_to :parent
scope :by_parent, ->(parent_id=nil) {
parent_id.to_i == 0 ? without_parent : where(parent_id: parent_id.to_i)
}
scope :without_parent, -> { where(parent_id: nil) }
end
那么您的控制器代码就是
Child.by_parent(params[:parent_id])