Ruby on rails 如何访问Rails中父模型的实例变量?

Ruby on rails 如何访问Rails中父模型的实例变量?,ruby-on-rails,methods,associations,parent-child,Ruby On Rails,Methods,Associations,Parent Child,我有两个模型,它们通过has\u many/属于\u关联。我在子模型中创建了一个类方法。但是我不知道如何从类方法中访问父模型的实例方法。以下是我试图做的简化: #User model class User < ActiveRecord::Base has_many :addresses def first_name "John" end def last_name "Doe" end end #Address m

我有两个模型,它们通过has\u many/属于\u关联。我在子模型中创建了一个类方法。但是我不知道如何从类方法中访问父模型的实例方法。以下是我试图做的简化:

#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
这将返回一个数组,因此您需要从该数组中拾取单个对象,前提是该数组不是空的

@user.address.first.full_name
这能实现什么?因为您可以获取用户对象的全名,并且不应根据地址进行更改:(

这将返回一个数组,因此您需要从该数组中拾取单个对象,前提是该数组不是空的

@user.address.first.full_name
这有什么作用?因为您可以获取用户对象的全名,并且不应根据地址进行更改:(


您混淆了类继承与模型关系,以及类方法与实例方法

丢失“self.”在“def self.full_name”中,它没有按照您的想法进行操作。然后将“parent”替换为“user”。parent向您提供对ActiveRecord::Base的引用,这与您定义的关系无关。“user”将向您提供特定地址的用户对象,这可能就是您正在寻找的对象


前面的答案已经讨论了为什么不能在@user.addresses上调用“全名”。

您混淆了类继承与模型关系,以及类方法与实例方法

丢失“self.”在“def self.full_name”中,它没有按照您的想法进行操作。然后将“parent”替换为“user”。parent向您提供对ActiveRecord::Base的引用,这与您定义的关系无关。“user”将向您提供特定地址的用户对象,这可能就是您正在寻找的对象


前面的答案已经解释了为什么你不能叫“全名”在@user.addresses上。

是的,我知道我可以在用户模型本身中定义全名。我想做的是找出如何从子模型中访问父方法。我将问题简化为用户/地址模型,以便于响应。我真正的问题涉及用户模型和活动模型。活动模型是支持的通过外部soap资源。我正在尝试创建一个方法,在该方法中,我可以调用user.activities.refresh,通过访问user.user\id中的user\u id来获取soap资源。如果活动数组为空,我希望能够执行此操作。如果要从子对象中访问父对象方法,则您已经知道父对象,因此只需在t上调用该方法他是我的父母。我显然很困惑,没有得到你想要的:)为我的不清晰道歉,我想创建一个URL“”从SOAP资源中获取数据并将其保存到activities表中。我定义了用于在活动模型中使用/保存SOAP响应的类方法。这些方法需要知道父对象的用户id。因此,这就是为什么我尝试访问父对象模型的实例方法的原因……我认为可能只需要控制就更简单了请传递用户\u id,以便我可以通过调用user.activities.refresh(用户\u id)进行刷新?是的,我知道我可以在用户模型本身中定义全名。我想做的是找出如何从子模型中访问父方法。我将问题简化为用户/地址模型,以便于响应。我真正的问题涉及用户模型和活动模型。活动模型由外部soap支持source。我正在尝试创建一个方法,在该方法中,我可以调用user.activities.refresh,通过访问user.user\id中的user\u id来获取SOAP资源。如果活动数组为空,我希望能够执行此操作。如果您想从子对象中访问父对象方法,您已经知道父对象,那么只需在父对象上调用该方法即可。我很清楚我很困惑,没有得到你想要的:)很抱歉我不够清晰,我想创建一个URL“”,从SOAP资源获取数据并将其保存到activities表。我在活动模型中定义了用于消费/保存SOAP响应的类方法。这些方法需要知道父级的用户id。因此,这就是我尝试访问父级模型的实例方法的原因。。。我想也许让控制器传递用户id更简单,这样我就可以通过调用user.activities.refresh(user\u id)进行刷新了?谢谢,这有助于解释为什么父级无法工作,因为它引用了ActiveRecord::Base。然而,我仍然想知道,如果我在Address中定义了一个类方法,如何引用用户实例方法。例如,如果我有一个名为@user的用户实例,我想从@soap调用@user.addresses.fetch\u,从外部soap源获取名为“John Doe”的用户的地址?我该怎么做?等等,如果你用fetch_from_SOAP从SOAP源获取地址,为什么还要调用@user.addresses?调用@user.addresses将查询数据库中user_id=@user.id所在的地址,并返回匹配地址对象的数组。您是否将地址同时存储在数据库和SOAP服务器中?我正在获取SOAP响应并将其保存到Rails数据库,这样应用程序就不必向SOAP服务器发出那么多请求,这会降低应用程序的速度@user.addresses将访问数据库中的所有本地地址@user.addresses.fetch_from_soap将获取新地址并将其与数据库合并。我将fetch_from_soap方法作为类方法放在address.rb中。也许不是最好的地方?我想转到调用fetch\u from\u soap方法,并将用户\u id作为soap请求的一部分传递。我明白了。首先,从_soap调用@user.addresses.fetch_将不会调用Address类中的任何方法,无论是实例还是类@user.addresses返回一个地址数组,但与Address类本身无关。您偶然做的是告诉Ruby查找一个名为fetch_from_soap的实例方法
@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
@user.full_name