1

当前代码

@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但有没有办法将单个活动记录的 ID 放入变量中@current_site_id

同样,总会有一个活动记录。

4

3 回答 3

3

如您所见,即使只有一行符合您的条件,where也会返回一个(一组行)。ActiveRecord::Relation您可以通过@current_site将行更改为以下内容来分配给您想要的行:

@current_site = Site.where(:name => @current_site_name).first
于 2012-04-10T16:33:22.430 回答
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

于 2012-04-10T16:50:35.183 回答
0

只是为了抛出另一个解决方案,您可以使用为您的模型创建的 Rails 的动态查找器。

@current_site = Site.find_by_name(@current_site_name)

这将返回一条记录(因此不需要使用first),并且在某些人看来可能被视为更简洁的代码。

于 2012-04-10T17:03:57.207 回答