首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >belongs_to关联无法加载从批量分配的设置器方法引用的目标父级

belongs_to关联无法加载从批量分配的设置器方法引用的目标父级
EN

Stack Overflow用户
提问于 2010-08-07 23:52:54
回答 1查看 684关注 0票数 0

似乎当子对象在setter中引用其父对象时,它无法初始化,除非在参数hash中首先给出外键。

代码语言:javascript
复制
class Bot < ActiveRecord::Base
  has_many :items
end

class Item < ActiveRecord::Base
  belongs_to :bot

  def name=(text)
    write_attribute(:name, "#{self.bot.name}'s #{text}")
  end
end

Item.new(:name => 'pitchfork', :bot_id => 1, ... )
# => undefined method `name' for nil:NilClass (NoMethodError)
Item.new(:bot_id => 1, :name => 'pitchfork', ... )
# => #<Item id: nil, bot_id: 1, name: "r2d2's pitchfork", ... >

请注意,在Ruby1.9中保留了散列键的顺序,但重点是,必须在引用其父对象的访问器之前设置bot_id

因此,下面的代码也可以工作:

代码语言:javascript
复制
item = Item.new
item.bot_id = 1
item.attributes = { :name => 'pitchfork', ... }

真正恼人的是,has_many集合上的build方法也不起作用,我认为如果有必要的话,这是打补丁的正确位置。

代码语言:javascript
复制
Bot.find(1).items.build(:name => 'pitchfork')
# => undefined method `name' for nil:NilClass (NoMethodError)

解决这个问题的最好办法是什么,或者修补这个问题,或者我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2010-08-08 01:10:32

您可以将合并后的字符串移动到after_update回调。这样,在正确设置Bot模型之前,您就不必访问它了。

但是,我可能会将name保留为一个简单的字符串,然后为合并后的字符串添加一个虚拟属性。这样,如果Bot的名称发生更改,它也会更新。

代码语言:javascript
复制
class Item < ActiveRecord::Base
  belongs_to :bot

  def full_name
    @full_name ||= "#{bot.name}'s #{name}"
  end
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3431045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档