【问题标题】:Trying to understand Syntactically how we are reference a Ruby symbol that's returned by ActiveRecord试图从语法上理解我们如何引用 ActiveRecord 返回的 Ruby 符号
【发布时间】:2012-03-03 17:31:19
【问题描述】:

所以我有一个示例,我在阅读中遇到了我们在 Rails 模型中定义的示例

has_many :some_tablename

然后他们通过说来引用它

if some_tablename.empty?
  #do something
end

我是 Ruby 的新手,所以我不太清楚为什么我不会这样做

if :some_tablename.empty?
  #do something
end

现在,我知道 .empty 可以在多种类型上调用,Symbol 不是其中之一。所以,我期待答案会是这样的......在符号上调用 .inspect 或 .to_s :some_tablename (在幕后)并返回一个字符串表示,然后我们称之为 .empty就可以了。

这是正确的,或者有人可以直接告诉我它是如何排列的:some_tablename 到 some_tablename?

【问题讨论】:

    标签: ruby-on-rails ruby symbols


    【解决方案1】:

    ActiveRecord 广泛使用 Ruby 作为元编程语言来执行您可以对模型进行的大部分查询。

    当您调用if some_table 时,您调用的是实际上不存在的some_table 方法,因此会调用ActiveRecord::Base 的method_missing 方法(如果您的模型扩展了它)并查看属性使用您的 has_many、belongs_to 指令构建的哈希,然后针对该缺失方法构建查询,特别是在您的情况下为内部连接,因为 some_table 是 has_many。

    检查http://apidock.com/rails/ActiveRecord/Base/method_missing。

    【讨论】:

    • 谢谢,我忘记了 missing_method 以及如何使用它。所以我可以想象 ActiveRecord 可能在后台做什么。
    【解决方案2】:

    之前给符号 has_many 方法只是定义一个关系,由该关系动态生成的方法使用该名称,但不直接构建您提供的符号。符号,作为参考,或多或少与字符串相同,只是它们是不可变的且内存高效(它们是单例,因此无论使用频率如何,它们都只会在内存中使用一次)

    有关关系的更多信息:http://guides.rubyonrails.org/association_basics.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 2011-09-11
      • 2015-04-01
      • 1970-01-01
      • 2021-05-01
      • 2014-08-11
      相关资源
      最近更新 更多