gpt4 book ai didi

ruby-on-rails - Rails - 包括与动态条件的关联

转载 作者:行者123 更新时间:2023-12-04 05:57:36 26 4
gpt4 key购买 nike

给定一个学校模型和一个学生模型,学校与学生有 has_many 关系:

has_many :students, :conditions => proc  { "year_id=#{send(:active_year_id)}" }

其中 active_year_id 是学校模型中定义的方法,我在调用时遇到“active_year_id 未定义”的错误:
School.where(:active => true).includes(:students)

当我这样做时,条件工作正常,例如,
School.where(:id => 10).students

只有当我尝试使用包含时才会出现该错误。这是正确的行为吗。如果没有,我做错了什么,我该如何解决?

使用 Rails 3.0.9,REE 1.8.7。

最佳答案

这有点老了,但我看到很多问题并且没有看到任何令人满意的解决方案。添加这样的条件本质上等同于创建具有两个公钥/私钥的关联。

@Fabio 说得对,“执行 proc 的上下文因调用方式而异。”但是我认为您可以克服“active_year_id 未定义”问题。

在示例中:

class School < ActiveRecord::Base
has_many :students, :conditions => proc { "year_id=#{send(:active_year_id)}" }
...

问题是在某些情况下,proc 在特定 School 对象的上下文中执行,有时作为 ActiveRecord::Associations::JoinDependency::JoinAssociation 执行。我使用稍微复杂的过程解决了这个问题,如下所示:
class School < ActiveRecord::Base
has_many :students, :conditions => proc {
self.respond_to?(:active_year_id) ?
{year_id: self.active_year_id} :
'students.year_id = schools.active_year_id'
}

因此,当为实际学校对象计算条件时, 自我 响应 active_year_id 属性访问器,您可以提供一个哈希作为条件(它比仅用于创建关联对象等的内插字符串更有效)

当上下文不存在时 自我 作为一个实际的学校对象,(如您所指出的,当使用 include 子句调用时会发生,例如)上下文是一个 JoinAssociation 并且条件的字符串形式使用字段名称而不是比值。

我们发现这个解决方案让我们成功地使用了动态关联。

关于ruby-on-rails - Rails - 包括与动态条件的关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6684521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com