从Rails中的模型访问singular_association_ids

时间:2011-01-23 07:38:08

标签: ruby-on-rails ruby

我一直在我的Rails应用程序中使用association_collection方法“other_ids”而没有任何问题。但是每当我尝试从定义关联的模型中访问它时,Rails就不知道我正在采取什么。例如:

class Membership < ActiveRecord::Base
    belongs_to  :course, :touch => true
    belongs_to  :person, :touch => true
end

class Day < ActiveRecord::Base
    belongs_to  :course,    :touch => true, :counter_cache => true
    has_many    :presents,  :dependent => :delete_all
    has_many    :people,    :through => :presents

    before_destroy  :clear_attendance

    def clear_attendance
        mems = Membership.where(:course_id => course.id, :person_id => person_ids)                                                   
        mems.update_all(["attendance = attendance - ?", (1 / course.days.size.to_f)])
    end
end

在这种情况下,person_ids始终为null。我尝试过self.person_ids,people.ids等等。我在其他地方使用过day.person_ids没有问题,为什么我不能在这里使用它?

我正在使用Ruby 1.9.1和Rails 3.0.3。这是我日志中的SQL调用:

[1m [36mAREL(0.0ms)[0m [1mUPDATE“会员资格”SET出勤率=出勤率 - 0.3333333333333333 WHERE(“会员资格”。“course_id”= 4)AND(“会员资格”。“person_id”IN(NULL)) [0米

编辑:添加更多代码以澄清问题

2 个答案:

答案 0 :(得分:1)

你真正想要的是:

def a_method
  self.people.all
end

但是要回答你的问题,person_ids是正确的方法,它应该返回一个空数组,而不是nil。我刚刚在2.3.10尝试了类似的协会。也许你可以发布一些代码,rails版本等等。

答案 1 :(得分:0)

感谢您的帮助 - 我自己弄清楚了。问题是我的回调顺序。删除关联后,我试图调用person_ids。将订单更改为此可以解决我的问题。

class Day < ActiveRecord::Base
   before_destroy  :clear_attendance

   belongs_to  :course,    :touch => true, :counter_cache => true
   has_many    :presents,  :dependent => :delete_all
   has_many    :people,    :through => :presents