Rails CollectionProxy以错误的顺序随机插入

时间:2014-06-18 08:49:36

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-4.1

我在模特中看到一些奇怪的行为,并希望有人可以对这个问题有所了解。

# user model
class User < ActiveRecord::Base
  has_many :events
  has_and_belongs_to_many :attended_events

  def attend(event)
    self.attended_events << event
  end
end

# helper method in /spec-dir
def attend_events(host, guest)
  host.events.each do |event|
    guest.attend(event)
  end
end

由于某种原因,在ID 1 的事件之前插入ID 2 的事件,如下所示:

#<ActiveRecord::Associations::CollectionProxy [#<Event id: 2, name: "dummy-event", user_id: 1>, #<Event id: 1, name: "dummy-event", user_id: 1>

但是,当我做一些似乎随机的事情时 - 例如像这样改变attend_event方法:

def attend_event(event)
  self.attended_events << event
  p self.attended_events # random puts statement
end

以正确的顺序插入。

#<ActiveRecord::Associations::CollectionProxy [#<Event id: 1, name: "dummy-event", user_id: 1>, #<Event id: 2, name: "dummy-event", user_id: 1>

我没有到这里来的是什么?

1 个答案:

答案 0 :(得分:1)

除非您在关联上指定订单,否则从数据库中检索关联时,关联是无序的(生成的sql不会有订单子句,因此数据库可以按任何顺序自由返回内容)< / p>

您可以通过执行(rails 4.x向上)指定订单

has_and_belongs_to_many :attended_events, scope: -> {order("something")}

或者,在早期版本

has_and_belongs_to_many :attended_events, :order => "something"

当您刚刚插入对象时,您可能会看到另一个对象 - 在这里您可能会看到加载的关联版本,它只是一个数组(由代理包装)