【问题标题】:Unitialized constant and name errors未初始化的常量和名称错误
【发布时间】:2016-01-19 16:23:31
【问题描述】:

我有一个包含表用户和表黑名单的数据库

在我的用户模型中,我想在 legacy_logid 列的黑名单表中搜索用户 ID 是否存在。

所以我定义

def blacklist_ip
  if Blacklists.legacy_logid == user.id
    Blacklists.value
  else
    nil
  end
end

在我看来,这似乎是一种非常简单的要求检查表格并查看用户 ID 是否在其中的方法。 但是没有..

uninitialized constant User::Blacklists

那么我如何在这个模型中访问不同表中的记录。 legacy_logid 是表的一个属性 - 我要做的就是查找它。

如果我尝试使用 ::Blacklists 我会得到

uninitialized constant Blacklists

如果我尝试

def blacklist_ip
 if Blacklist.legacy_logid == user.id
Blacklist.value
 else
nil
 end
end

我明白了

Undefined method `legacy_logid' for #<Class:0x00000006407e40>

我将黑名单定义为

class Blacklist < ActiveRecord::Base

end

它不是我想要查找的方法 - 它是一个属性,但似乎只能以不合逻辑的方式访问。

【问题讨论】:

  • 无法解析常量Blacklists。使用时尝试在前面加一个双冒号:::Blacklists。这将导致另一个错误,但说明自动加载不起作用。我最好的猜测是,当您改为编写 Blacklist(单数)时,您的代码将起作用。
  • 您是否在某处定义了Blacklists? Rails 不是魔法。您不能只说出一个名称并假设 Rails 会知道它是您要对其执行查询的数据库表的名称。要了解 Rails 如何将类(模型)链接到数据库表,您应该阅读Active Record Basics Rails 指南。
  • 当您执行grep -R "Blacklists" ./app/models 时会发生什么?如果什么都没出现,那么您还没有定义类/模块/常量Blacklists。知道 Rails 中的表是复数的,但它们必须由单数模型支持。 (User 类/模型和users 表。)

标签: ruby uninitialized-constant


【解决方案1】:

首先,在 rails 中,模型名称以单数形式编写,而表则以复数形式编写。

所以请确保您有一个表users 和另一个blacklists,以便您可以分别通过UserBlacklist 模型访问它们。

您可以通过以下操作查找blacklists 中是否存在具有给定用户ID 的记录:

def blacklist_ip
  Blacklist.where(legacy_logid: self.id)
end

我想你的模型之间的关系是User 有很多BlacklistBlacklist 属于User

如果您像下面这样定义 User 类,您将能够返回给定用户的所有被列入黑名单的 ip:

class User < ActiveRecord::Base
  has_many :blacklists

  def blacklist_ip
    self.blacklists
  end
end

【讨论】:

  • Blacklist.where("legacy_logid = ?", self.id)可以写成Blacklist.where(legacy_log_id: id)
  • 这看起来很棒@CristianoAlencar 如果我做了 def blacklist_ip Blacklist.where(legacy_logid: self.id) end 那么我应该能够通过 user.blacklist_ip.other_table 获得表中的其他列我想?
  • @CristianoAlencar 好的,这让我大部分时间都在那里 - 但是我如何访问该表中的列。您的解决方案为我提供了活动记录 - 所以我有行但如果 blacklisted_exists.exists 则定义为 blacklisted_ip? blacklisted_exists.value end end 然后告诉我没有价值的方法。如果我有对象并且值是该对象的属性 - 我如何得到它(这必须是基本的,我看起来像个傻瓜!!)
猜你喜欢
  • 1970-01-01
  • 2015-05-03
  • 2016-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
相关资源
最近更新 更多