Rails 如何能更好的获取或者找回关联的对象?

kai209209 · 2015年11月13日 · 最后由 kai209209 回复于 2015年11月13日 · 1824 次阅读

在 Rails 项目中有这么一个情况,有 2 个 model

class A < ActiveRecord::Base
  has_many :b
end

class B < ActiveRecord::Base
  belong_to :a


  def self.search_bs(params)    
    a = self.first.a
    xxxx
    xxxx
  end
end

然后比如在 b 的 controller 里面有个 action show

def show
  @bs = a.bs.search_bs(params)
end

而 self.search_bs(params) 这个方法需要找回对象 a,我一开始会直接通过 self.first.a 直接能找回对象 a,但是当我发现如果 a 的 bs 为空时,就产生报错,这里可能说在方法传入 a 不就完了嘛,但是因为这个 self 是一个# ,所以我感觉应该有方法能直接通过 self 直接找回 a,不知道 rails 是否有这样的方法呢?

那么 a.bs 为空的时候你期望这个方法怎么处理?

#1 楼 @rei 为空的事就是下面其他要处理的代码了,因为这个方法的 self 就是这个 a.bs,而我只想获取这个 a

#2 楼 @kai209209 那这个方法应该是 A 的实例方法。

#3 楼 @rei 请问你说的意思是什么?没看明白啊。 上面的例子只是我简化了而已,而我实际项目确实需要找回 a 对象

class A < ActiveRecord::Base
  has_many :bs

  def search_bs(params)
  end
end
def show
  @bs = a.search_bs(params)
end

#5 楼 @rei 确实是一个好方法,感谢,但是实际上项目中这个 search_bs(params) 涉及了其他在 B 中的方法,而且在 B controller 中使用,所以为了能更好的进行代码维护,所以我放在 class B 中

#6 楼 @kai209209 那么就把 a 当参数。

为啥 search_bs 可以这样调?它不是 B 的类方法吗?

a.bs.search_bs(params)

#7 楼 @rei 找到方法了,self.proxy_association.owner 就可以找回 a 了。

#8 楼 @psvr 是类方法啊,至于为什么能这样用,我也说不清,让高手帮你解释一下吧

需要 登录 后方可回复, 如果你还没有账号请 注册新账号