Попытка синтаксически понять, как мы ссылаемся на символ Ruby, возвращаемый ActiveRecord - PullRequest
0 голосов
/ 11 февраля 2012

Итак, у меня есть пример, с которым я столкнулся в каком-то чтении, где мы определяем модель рельсов

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?

Ответы [ 2 ]

2 голосов
/ 11 февраля 2012

ActiveRecord широко использует Ruby в качестве языка метапрограммирования для выполнения большей части запросов, которые вы можете выполнить над моделью.

Когда вы вызываете if some_table, вы вызываете метод some_table, которого на самом деле не существует, поэтому вызывается метод method_missing для ActiveRecord::Base (если ваша модель его расширяет), и он смотрит в атрибуты. хеш, который создается с вашими директивами has_many, belongs_to, а затем создает запрос к этому отсутствующему методу, в частности, к внутреннему объединению в вашем случае, поскольку some_table является has_many.

Чек http://apidock.com/rails/ActiveRecord/Base/method_missing.

1 голос
/ 11 февраля 2012

Давая символ назад, метод has_many просто определяет отношение, методы, которые динамически генерируются этим отношением, используют это имя, но не строят непосредственно из предоставленного вами символа.Символы, для справки, более или менее совпадают со строками, за исключением того, что они являются неизменяемыми и эффективными для памяти (это синглтоны, поэтому они используются только один раз в памяти независимо от того, как часто они используются)

ДляПодробнее об отношениях: http://guides.rubyonrails.org/association_basics.html

...