Ruby 如何在多个关联的范围内使用模型值

Ruby 如何在多个关联的范围内使用模型值,ruby,activerecord,Ruby,Activerecord,有没有一种方法可以在关联中使用两个值来限制数据集,而不是只使用一个 我在模型Foo中有一个多个模型Nyaw的关联,应该使用两个值而不是一个值来映射 我尝试了以下代码,但似乎无法为NoMethodError错误定义方法“other_id”: self.other_id将是Foo model行中的一个值,我将其称为关联。例如,foo.nyaws,其中foo是单行 就SQL而言,这类似于SELECT*FROM foos LEFT JOIN nyaws ON foos.nyaw_id=nyaws.id和

有没有一种方法可以在关联中使用两个值来限制数据集,而不是只使用一个

我在模型Foo中有一个多个模型Nyaw的关联,应该使用两个值而不是一个值来映射

我尝试了以下代码,但似乎无法为NoMethodError错误定义方法“other_id”:

self.other_id将是Foo model行中的一个值,我将其称为关联。例如,foo.nyaws,其中foo是单行

就SQL而言,这类似于SELECT*FROM foos LEFT JOIN nyaws ON foos.nyaw_id=nyaws.id和foos.random_id=nyaws.something。因此,我基本上希望能够在有人调用关联时,在每个查询之后以及在每个查询中添加该部分

似乎有一些建议,但所有的官方信息只提到硬编码的值,而没有提到使用定义关联的模型中的值


我发现最接近的方法是类似的,但这只适用于像类普通方法一样使用的范围。

我绕过了这个问题,创建了一个简单的方法来模拟我们需要的方法,如下所示:

class Foo < ActiveRecord::Base
  # Instead of has_many :nyaws, -> { where "another_id = ?", self.another_id }
  def nyaws
    Nyaw.where([ "id = ? AND another_id = ?", self.nyaw_id, self.another_id ])
  end
end

我绕过了这个问题,创建了一个简单的方法来模拟我们的需求,如下所示:

class Foo < ActiveRecord::Base
  # Instead of has_many :nyaws, -> { where "another_id = ?", self.another_id }
  def nyaws
    Nyaw.where([ "id = ? AND another_id = ?", self.nyaw_id, self.another_id ])
  end
end

你希望self.Other\u id返回什么?你是否意识到,在这种情况下,自我就是阶级?@AndreyDeineko:它应该是来自Foo模型的价值。我知道它不起作用,我给了它一个我尝试过的例子,并举例说明我想用伪ish代码实现什么。来自Foo模型的值是模糊的。这是类属性还是模型的表列?啊,是的,对不起,模型的表列。对于关联,将有一行Foo,该行对于关联被调用为,因此我希望我能够在关联比较中使用该行的值。特别是因为默认情况下已经存在primary_key=foreign_id条件。您希望self.other_id返回什么?你是否意识到,在这种情况下,自我就是阶级?@AndreyDeineko:它应该是来自Foo模型的价值。我知道它不起作用,我给了它一个我尝试过的例子,并举例说明我想用伪ish代码实现什么。来自Foo模型的值是模糊的。这是类属性还是模型的表列?啊,是的,对不起,模型的表列。对于关联,将有一行Foo,该行对于关联被调用为,因此我希望我能够在关联比较中使用该行的值。特别是因为默认情况下已经存在primary\u key=foreign\u id条件。我不知道为什么has\u many不能像我预期的那样工作,我真的不知道我是否应该打开一个特性请求,向上游发布关于这一点的信息。在内部,作用域是包装好的,所以我不能以任何方式将数据从模型泄漏到作用域,所以我需要做一些非常脆弱的猴子补丁,所以我现在就用这个来避免它。而且这也不能完全回答我的问题,所以我不确定是否应该接受这个答案。意见?是什么原因导致has_Muny没有像我预期的那样工作,我不知道,我真的不知道我是否应该打开一个功能请求,向上游发布这方面的信息。在内部,作用域是包装好的,所以我不能以任何方式将数据从模型泄漏到作用域,所以我需要做一些非常脆弱的猴子补丁,所以我现在就用这个来避免它。而且这也不能完全回答我的问题,所以我不确定是否应该接受这个答案。意见?