![](/img/trans.png)
[英]Ruby on Rails 3 - create an instance of one model from another model
[英]Can't access one model's instance variables from another model) (self.ruby)
我有两个模型,草稿和选择。 草稿在名为“ available_players”的实例变量中创建了一组可用的玩家。 这是使用“ before_save”回调完成的。 回调运行实例方法“ start”,而实例方法又运行“ set_active_players”。 我已经在Draft_spec中测试了所有这些功能,并且在加载播放器并将它们返回到available_players数组中时没有问题。 我所有的规格草案都通过了。
问题是,当我尝试从Pick.rb访问“ available_players”实例变量时,它返回nil。 如果我调用“ draft.start”(应在Draft.rb保存之前运行的实例方法),我可以突然访问“ available_players”数组...就好像草稿对象没有创建available_players数组,即使我有before_save方法就位。
这是在Pick.rb内部失败的代码:
def available_players_returns_nil
@draft_object.available_players
end
这是在Pick.rb内部起作用的代码:
def available_players_working
@draft_object.start
@draft_object.available_players
end
我不想每次调用该方法时都必须调用start,因为available_players不需要重新加载所有Player。 请帮助我访问available_players!
链接: 未能通过Pick spec , Pick.rb
编辑:我应该添加@draft_object被发现使用
@draft_object = Draft.find(self.draft_id)
首先,这是错误的:
@draft_object = Draft.find(self.draft_id)
您已经建立了关联,因此请使用它。 您只需在Pick
对象中使用draft
即可访问其所属的Draft
。 无需将其分配给名为@draft_object
的实例变量。
与player
同一个故事。
顺便说一句, Draft
的set_available_players
方法只是循环遍历所有播放器,并将它们添加到实例变量中。 你为什么做这个? 如果您在Pick
需要他们,为什么不直接直接吸引他们呢? 像这样:
@players = Player.all
另外...我有点担心,几乎所有测试都已被注释掉。 我希望不是设计使然?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.