В чем разница между ссылками на object.id и object [: id] при возврате набора данных модели? - PullRequest
3 голосов
/ 10 марта 2010

Привет, ребята, я занят изучением ROR ... Я не совсем уверен, как искать эту проблему в stackoverflow, так что извините, если об этом уже спрашивали: p

В основном я нахожусь в консольной среде, занятой чтением всех строк из таблицы в переменную, и я заметил, что вы можете ссылаться на результаты, задав my_object.id ИЛИ my_object[:id].

Может кто-нибудь сказать мне, если есть конкретная причина для этого? Является ли один из этих «методов» устаревшим или с чем это связано?

Вот фрагмент кода: (при условии, что все установлено)

my_object = MyModel.find(:all)
my_object[1].id #returns => 'my value'
my_object[1][:id] # also returns => 'my value'

Какой из этих методов является наилучшей практикой? Или это чисто условное обозначение?

Спасибо :)

Ответы [ 3 ]

2 голосов
/ 13 марта 2010

вы должны использовать

my_object[1].id

«id» - это метод экземпляра, сгенерированный rails в классе MyModel, и у него есть соответствующий метод экземпляра «id =» setter (да, это метод)

в другой руке

my_object[1][:id] or my_object[1]["id"] 

получит прямой доступ к хешу @attributes:

    def read_attribute(attr_name)
      attr_name = attr_name.to_s
      if !(value = @attributes[attr_name]).nil?
      ......
    end

Я бы хотел, чтобы вы увидели этот код

def [](attr_name)
   read_attribute(attr_name)
end

my_object[1][:id]

Если вы видите подпись метода [], возможно, вы подумаете, что можете вызвать метод следующим образом:

my_object[1][](:id)

но вы не можете этого сделать, потому что Ruby делает некоторые хитрости за кулисами, чтобы он выглядел так же, как если бы вы обращались к обычному массиву (как это делают php, js и т. Д.), Не запутайтесь. 1018 *

1 голос
/ 10 марта 2010

Это способ создания read_attribute, который защищен вне класса. Из ActiveRecord::Base исходного кода:

# Returns the value of the attribute identified by <tt>attr_name</tt> after it has been typecast (for example,
# "2004-12-12" in a data column is cast to a date object, like Date.new(2004, 12, 12)).
# (Alias for the protected read_attribute method).
def [](attr_name)
  read_attribute(attr_name)
end

model.attribute - самый распространенный способ сделать это. Очевидно, что метод [] хорошо работает, если имя атрибута хранится в переменной.

0 голосов
/ 10 марта 2010

Я бы использовал model.attribute, он более стандартен и дает вам гибкость, если вам нужно переопределить его:

u = User.first
u.identity_url
=> nil
class &lt&lt u
  def identity_url
    read_attribute(:identity_url) || "undefined"
  end
end
=> nil
u.identity_url
=> "undefined"
u[:identity_url]
=> nil

Вроде неудачный пример, но вы поняли.

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