Как мне получить доступ к переменным экземпляра родительской модели в Rails? - PullRequest
2 голосов
/ 09 ноября 2010

У меня есть две модели, которые связаны через has_many / assign_to. Я создал метод класса в дочерней модели. Но я не могу понять, как получить доступ к методам экземпляра родительской модели из метода класса. Вот упрощение того, что я пытаюсь сделать:

#User model
class User < ActiveRecord::Base
    has_many :addresses

    def first_name
        "John"
    end

    def last_name
        "Doe"
    end
end

#Address model
class Address < ActiveRecord::Base
    belongs_to :user

    def self.full_name
        parent.first_name + " " + parent.last_name
        #returns full name of parent "John Doe"
    end
end

Я хотел бы иметь возможность запустить это в консоли Rails и вернуть "John Doe" ... но не повезло. Есть предложения?

@user = User.first
@user.addresses.full_name

Ответы [ 2 ]

0 голосов
/ 09 ноября 2010

Вы путаете наследование классов с отношениями Модели, а методы класса с методами экземпляров.

Потеряете "себя".в "def self.full_name" - это не то, что вы думаете.Затем замените «родитель» на «пользователь».Родитель дает вам ссылку на ActiveRecord :: Base, которая не имеет ничего общего с определенными вами отношениями.«пользователь» предоставит вам объект User этого конкретного адреса, который, вероятно, то, что вы ищете.

В предыдущем ответе уже говорилось, почему вы не можете вызвать «полное_имя» на @ user.addresses.

0 голосов
/ 09 ноября 2010
@user.addresses.full_name

Возвращает массив, поэтому вам нужно выбрать один объект из массива, предполагая, что массив не пустой.

@user.address.first.full_name

Что это дает?Потому что вы можете получить полное имя пользовательского объекта, и оно не должно меняться в зависимости от адреса: (

class User < ActiveRecord::Base
    has_many :addresses

    def first_name
        "John"
    end

    def last_name
        "Doe"
    end

    def full_name
        self.first_name + " " + self.last_name
    end 
end

Так что теперь вы можете получить доступ к full_name из @user объекта

@user.full_name
...