Ruby on rails 如果全局命名空间中存在相同的名称,则在作用域控制器中查找错误的模型命名空间

Ruby on rails 如果全局命名空间中存在相同的名称,则在作用域控制器中查找错误的模型命名空间,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我有一个问题模型声明如下: Question < ActiveRecord::Base Quiz::Question < ActiveRecord::Base 然后只需调用::quick::Question.test(或quick::Question.test)它会在一些作用域控制器和视图中显示“来自全局问题的你好”(使用作用域:模块=>“…”)。如果我从全局命名空间(如application.html.erb)中的视图或控制器调用::quick::Question,它将显示预期

我有一个问题模型声明如下:

Question < ActiveRecord::Base
Quiz::Question < ActiveRecord::Base

然后只需调用
::quick::Question.test
(或
quick::Question.test
)它会在一些作用域控制器和视图中显示“来自全局问题的你好”(使用
作用域:模块=>“…”
)。如果我从全局命名空间(如application.html.erb)中的视图或控制器调用::quick::Question,它将显示预期结果(->quick命名空间中的问题模型)。

您可以在模型中显式设置表名,但是您不应该调用
quick::Question.table\u name
而不是
::quick::Question.table\u name
?或者这是一个打字错误

class Quiz::Question < ActiveRecord::Base
  self.table_name = 'quiz_questions'
end
class-quick::Question
您可以在模型中显式设置表名,但不应该调用
quick::Question.table\u name
而不是
::quick::Question.table\u name
?或者这是一个打字错误

class Quiz::Question < ActiveRecord::Base
  self.table_name = 'quiz_questions'
end
class-quick::Question
它正在访问您想要访问的常量,只有
表名
为这两个类返回一些值。另外,ActiveRecord::Base的
inspect
方法被定义为显示数据库表的内容,并且由于两个类都指向同一个表,因此两个类的结果都是相同的。您可以通过以下方式检查它是否调用了正确的类:

::Quiz::Question.name
实验 尝试在两个类上定义方法测试:

class Question
  def self.test
    'Hello from global Question'
  end
end

class Quiz::Question
  def self.test
    'Hello form namespace Quiz'
  end
end
class Question
  def self.test
    'Hello from global Question'
  end
end

class Quiz::Question
  def self.test
    'Hello form namespace Quiz'
  end
end
然后做:

::Quiz::Question.test

然后看看你会得到什么结果,当你访问你想要访问的常量时,仅仅是
表名
为这两个类返回了一些值。另外,ActiveRecord::Base的
inspect
方法被定义为显示数据库表的内容,并且由于两个类都指向同一个表,因此两个类的结果都是相同的。您可以通过以下方式检查它是否调用了正确的类:

::Quiz::Question.name
实验 尝试在两个类上定义方法测试:

class Question
  def self.test
    'Hello from global Question'
  end
end

class Quiz::Question
  def self.test
    'Hello form namespace Quiz'
  end
end
class Question
  def self.test
    'Hello from global Question'
  end
end

class Quiz::Question
  def self.test
    'Hello form namespace Quiz'
  end
end
然后做:

::Quiz::Question.test

并查看您将得到的结果

您应该在
测验
模块中设置
表格名称前缀

# app/models/quiz.rb
module Quiz
  def self.table_name_prefix
    'quiz_'
  end
end

# app/models/quiz/question.rb
class Quiz::Question < ActiveRecord::Base
end

# app/models/question.rb
class Question < ActiveRecord::Base
end

您应该在
测验
模块中设置
表格\u名称\u前缀

# app/models/quiz.rb
module Quiz
  def self.table_name_prefix
    'quiz_'
  end
end

# app/models/quiz/question.rb
class Quiz::Question < ActiveRecord::Base
end

# app/models/question.rb
class Question < ActiveRecord::Base
end

实际上,对于您的quick::Question和Question模型,即使您的模型不同,Rails也会认为它们具有相同的表名,除非您指定它:

class Quiz::Question < ActiveRecord::Base

  def self.table_name_prefix
  'quiz_'
  end

  [...]

end
class-quick::Question
实际上,对于您的两个quick::Question和Question模型,即使您的模型不同,Rails也会认为它们具有相同的表名,除非您指定它:

class Quiz::Question < ActiveRecord::Base

  def self.table_name_prefix
  'quiz_'
  end

  [...]

end
class-quick::Question
我不知道到底是什么问题(可能与rails自动加载有关),但我通过在测验模型中添加“require”语句解决了这个问题:

class Quiz < ActiveRecord::Base
  require 'quiz/question'
end
课堂测验

在app/models/quick.rb中,我不知道到底是什么问题(可能与rails自动加载有关),但我通过在我的测验模型中添加一个“require”语句解决了这个问题:

class Quiz < ActiveRecord::Base
  require 'quiz/question'
end
课堂测验

在app/models/quick.rb中

对于那些来这里寻找与类而不是表相关的答案的人来说,ruby似乎无法区分不同名称空间中同名的两个类,因此您应该始终以不同的方式命名类本身

这里有一个解释:

对于那些来这里寻找与类而不是表相关的答案的人来说,ruby似乎无法区分不同名称空间中同名的两个类,因此您应该始终以不同的方式命名类本身

这里有一个解释:

谢谢你的回答。问题不是表名不对,问题是ruby使用了错误的模型(问题模型而不是Quike::question模型)。我猜我得到了“根”路径,在调用的前面加上“:”,但这没有什么区别-如果我调用“quick::Question”instad of,问题仍然存在:“quick::Question”。谢谢你的回答。问题不是表名不对,问题是ruby使用了错误的模型(问题模型而不是Quike::question模型)。我猜我得到了“根”路径,在调用的前面加上“:”,但这没有什么区别-如果我调用“quick::Question”instad of,问题仍然存在:“quick::Question”。谢谢你的回答。问题不在于表名。如果我使用“name”或“inspect”,它将显示全局问题模型的名称或信息。问题是::quick::Question始终指向全局命名空间中的问题模型,而不是quick命名空间中的问题模型。@经验-它不指向,至少不应该指向。您是如何检查的?::quick::Question.inspect在全局名称空间中返回有关我的问题模型的信息,而不是在我的quick名称空间中。@Experience-您可以编辑您的问题以显示其结果以及您期望的结果吗。很自然,inspect会为这两个类返回相同的结果,因为它们指向同一个数据库表。刚刚将我的问题与您的实验结果一起添加。谢谢您的回答。问题不在于表名。如果我使用“name”或“inspect”,它将显示全局问题模型的名称或信息。问题是::quick::Question始终指向全局命名空间中的问题模型,而不是quick命名空间中的问题模型。@经验-它不指向,至少不应该指向。您是如何检查的?::quick::Question.inspect在全局命名空间中返回有关我的问题模型的信息,而不是在我的quick命名空间中。@Experience-您能编辑您的问题以显示吗