通过Parent调用Child的范围

时间:2016-10-04 14:53:22

标签: ruby-on-rails

我在我的Child的模型profile.rb中定义了一个范围方法,如下所示

scope :fees_to, -> (fees_to) { where("fees_to <= ?", "#{fees_to}") }

tutor.rb的父母中有

has_one :profile, dependent: :destroy

现在在rails控制台中,我可以Profile.all.fees_to(10)为例,其有效。但是,如何通过父fees_to调用Tutor方法?

现在基本上我可以在索引视图中过滤我的profiles了。但我想做的是根据孩子的值过滤tutor索引视图。

非常感谢所有的帮助和建议!谢谢

3 个答案:

答案 0 :(得分:0)

这对于has_one毫无意义。你不能“拥有一个”并仍然适用范围。范围适用于许多记录,应用其他条件并缩小结果集范围,而不是特定记录。

您有效地尝试将where(fees_to < ?)条件添加到特定记录,这显然毫无意义。

如果您想通过关联使用范围,则需要has_many

答案 1 :(得分:0)

master中: 您可以创建如下函数:

profile.rb

然后在rails console中:

def fees_to n
   Profile.fees_to(n) # your scope is called here
end

它就像一个过滤器。如果个人资料的费用为&gt; tutor = Tutor.first tutor.profile.fees_to(10) ,您将获得n(数组为空)

<强>已更新

[]

可能你想要那样的循环:

bad =>  @tutor = Tutor.all 
good => @tutor = Tutor.includes(:profile).all # with eager loading, avoid n+1 query.

答案 2 :(得分:0)

我在tutor.rb

中定义了以下内容
def self.fees_search(n)
    @profile = Profile.fees_to(n)
    if @profile.empty?
      return Tutor.none
    else
      @profile.each do |y|
        y.tutor
      end
    end
  end

不确定它是否笨重或是否存在冗余,但它在rails控制台中运行得非常好。我可以做Tutor.fees_search(10)并相应地呈现所有相应的导师。

干杯