我在模特中看到一些奇怪的行为,并希望有人可以对这个问题有所了解。
# 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>
我没有到这里来的是什么?
答案 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"
当您刚刚插入对象时,您可能会看到另一个对象 - 在这里您可能会看到加载的关联版本,它只是一个数组(由代理包装)