当前代码
@current_site_name = 'SITENAME'
@current_site = Site.where(:name => @current_site_name)
@current_site_id = @current_site.id
基本上,name
模型中的Site
列是唯一的。我们使用站点名称作为参数选择一行。
我被退回:<ActiveRecord::Relation:0x59426bc1>
我理解我不能简单地询问@current_site.id
但是有没有办法将单个activerecord的ID放入变量@current_site_id
同样,总会有一条活动记录。
答案 0 :(得分:3)
正如您所见,where
将返回ActiveRecord::Relation
(一组行),即使只有一行符合您的条件。您可以通过将行更改为此行,将@current_site
分配给您想要的行:
@current_site = Site.where(:name => @current_site_name).first
答案 1 :(得分:0)
Site.where(:name => @current_site_name).methods.include? :id #=> false
但
Site.where(:name => @current_site_name).instance_methods.include? :id #=> true
然而,
Site.where(:name => @current_site_name).instance_eval "id" #=> NameError
和
Site.where(:name => @current_site_name).methods.include? "self.id" #=> NoMethodError
那就是说,假设在你的情况下,只有一条记录应该返回
Site.where(:name => @current_site_name).instance_eval('find_first').id
find_first
方法是protected
所以我们必须跳过执行范围以避免另一个NoMethodError
答案 2 :(得分:0)
只是为了抛出另一个解决方案,您可以使用为您的模型创建的Rails'dynamic finders。
@current_site = Site.find_by_name(@current_site_name)
这会返回一条记录(因此不需要使用first
),并且在某些人看来可能被视为更清晰的代码。