основной вопрос рельсов - PullRequest
3 голосов
/ 01 декабря 2010
  class Person < ActiveRecord::Base
    validates_uniqueness_of :user_name, :scope => :account_id
  end

Мой вопрос касается трех приведенных выше строк кода. Кстати, я программист на C ++ и новичок в ruby ​​и rails. Я очень очень смущен строкой: validates_... что это? переменная определение? вызов функции? или что-то эль. Для меня это странная строка в определении класса.

Ответы [ 3 ]

2 голосов
/ 01 декабря 2010

Это вызов функции.

Функция определена в модуле (ActiveRecord :: Validations).Модули в Ruby - это объекты, к которым могут быть прикреплены функции и переменные.

Вы можете включить модуль и получить его члены.Здесь это делается в вашем родительском классе: ActiveRecord :: Base.Если вы посмотрите на его определение, оно начинается с чего-то вроде:

module ActiveRecord
  class Base
    include ActiveRecord::Naming
    # ...
    include ActiveRecord::Validations
    #...
  end
end

Существуют некоторые заметные различия в том, как C ++ и Ruby обрабатывают объявление класса.Во-первых, в Ruby нет компиляции.Таким образом, определение класса может быть изменено во время выполнения.И на самом деле это стандартный способ объявления класса.Другими словами: классы в Ruby всегда открыты.

Во-вторых, тело класса может иметь любой исполняемый код.В C ++ нельзя вызывать функцию из определения класса.Это не имеет большого смысла.Тем не менее, в Ruby это возможно, поскольку Вы можете выполнять метапрограммирование.Таким образом, вы можете вызвать функцию, которая создает некоторые члены.Это написание функций, которые могут писать другие функции.Это может значительно повысить производительность и одновременно вызвать наихудшие ошибки.

Я бы настоятельно рекомендовал обратиться к метапрограммированию Ruby: декларативное добавление методов в запись класса .

2 голосов
/ 01 декабря 2010

Это вызов функции.Вы можете переписать его как validates_uniqueness_off(:user_name, :scope => :account_id).В Ruby принято игнорировать эти скобки.Rails предоставляет вам эти методы класса как часть ActiveRecord::Validations модуля. rails API может дать вам больше информации о том, как он определен, и вы также можете взглянуть на источники, чтобы увидеть, как он реализован.Надеюсь, это поможет.

0 голосов
/ 01 декабря 2010

Это вызов функции.Вы можете найти здесь больше примеров проверок модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...