开发者

Accessing singular_association_ids from model in Rails

I've been using the association_collection method "other_ids" throughout my Rails app with no issues. However whenever I try to access it from within the model defining the association, Rails has no idea what I'm taking about. For example:

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

In this case, person_ids is always null. I've tried self.person_ids, people.ids, etc. All nothing. I have used day.person_ids elsewhere with no issues, so why can't I use it here?

I am using Ruby 1.9.1 and Rails 3.0.3. Here is the SQL c开发者_JAVA百科all from my log:

[1m[36mAREL (0.0ms)[0m [1mUPDATE "memberships" SET attendance = attendance - 0.3333333333333333 WHERE ("memberships"."course_id" = 4) AND ("memberships"."person_id" IN (NULL))[0m

edit: added more code to clarify question


What you really want there is:

def a_method
  self.people.all
end

But to answer your question, person_ids is the correct method, and it should return an empty array, not nil. I just tried an association like that out in 2.3.10. Maybe you can post some more of your code, rails version, etc.


Thanks for your help - I figured it out myself. The problem was the order of my callbacks. I was trying to call person_ids after the association had been deleted. Changing the order to this solved my issues.

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜