获取activerecord模型的ID

时间:2012-04-10 16:29:46

标签: ruby-on-rails ruby-on-rails-3 activerecord

当前代码

@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

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

3 个答案:

答案 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),并且在某些人看来可能被视为更清晰的代码。