Datamapper, определение ваших собственных методов объекта, как? - PullRequest
3 голосов
/ 17 июня 2010

Допустим, у меня есть класс, подобный приведенному ниже.

class List
  include DataMapper::Resource
  property :id, Serial  
  property :username, String

  def self.my_username
    return self[:username]
  end
end

list=List.create(:username=>,'jim')
list.my_username

Когда я запускаю его, он говорит мне, что метод не может быть найден, и при дополнительном исследовании вы можете определить только методы класса (не методы объекта)) и что методы класса не имеют доступа к данным объектов.

Есть ли способ включить эти методы в качестве методов объекта и получить доступ к данным объекта?Я использую Ruby 1.8.6 и последнюю версию datamapper.

Ответы [ 2 ]

7 голосов
/ 17 июня 2010

Избегайте всего себя, и оно станет InstanceMethod:

class List
  include DataMapper::Resource
  property :id, Serial  
  property :username, String

  def my_username
    return self[:username]
  end
end

list=List.create(:username=>'jim')
list.my_username
4 голосов
/ 18 июня 2010

Вы можете рассматривать область действия класса как Model (таблица в СУБД) и область действия экземпляра как Resource (строка в СУБД).Теперь, если вы определяете методы класса (как вы сделали с self.my_username), вы работаете с Model (он же таблица, иначе все строки).Если вы определите методы экземпляра, они будут доступны для Resource (он же одна строка).

Типичные сценарии использования методов класса - это создание (цепочек) запросов / запросов.Они в основном будут работать с тем же эффектом, что и Active Record 2.x named_scope.Вы можете вызвать цепочку методов класса и не выполнять ни одного запроса, если у вас нет явного доступа к данным, которые должен предоставить запрос.DataMapper будет продолжать создавать и изменять объекты запросов до того момента, когда вам действительно потребуется доступ к данным.Это работает только в том случае, если каждый метод класса в цепочке возвращает экземпляр DataMapper::Collection, который обычно достигается путем возврата результата вызовов в all (или объединения их с операторами набора, такими как +, -, &и |.

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