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

标签 ruby-on-rails ruby-on-rails-3 activerecord

给定一个学校模型和一个学生模型,学校与学生有 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/

相关文章:

ruby - Rails update_all 与 hstore

ruby-on-rails-3 - Ubuntu - Apache - Rails - 乘客 - 生成错误

ruby-on-rails-3 - 如何在子模型中使用 after_save 回调来更新父模型中的属性?

MySQL Rails REGEXP 不能使用反斜杠

ruby-on-rails - 如何按距离以外的方式对Rails Geocoder gem的结果进行排序

ruby-on-rails - 在Ruby中使用fakeweb或webmock模拟RestClient::GatewayTimeout?

ruby-on-rails - 使用 form_for 时出现未定义方法 'to_key' 错误

ruby-on-rails - 订单语句的 Rails PostgreSQL 问题

ruby-on-rails - rails : How do you handle dynamic attributes in the database?

ruby-on-rails - STI 与 has_one 通过不工作