Rails构建方法修改对象

时间:2012-09-26 20:18:21

标签: ruby-on-rails ruby

假设我的助手中有这个简单的方法可以帮助我检索客户端:

def current_client 
  @current_client ||= Client.where(:name => 'my_client_name').first
end

现在调用current_client会返回:

#<Client _id: 5062f7b851dbb2394a00000a, _type: nil, name: "my_client_name">

完美。客户端有一些关联用户,让我们看看最后一个:

> current_client.user.last
#<User _id: 5062f7f251dbb2394a00000e, _type: nil, name: "user_name">

稍后在new方法中,我称之为:

@new_user = current_client.user.build

现在,令我惊讶的是,调用current_client.user.last会返回

#<User _id: 50635e8751dbb2127c000001, _type: nil, name: nil>

但用户数量不会改变。换句话说 - 它不会添加新用户,但缺少一个用户......为什么会这样?我该如何修理?

1 个答案:

答案 0 :(得分:1)

current_client.users.count对数据库进行往返,以确定关联的用户记录数。由于新用户尚未保存(仅构建),因此数据库不知道它。

current_client.users.length将使用Ruby为您提供计数。

current_client.users.count # => 2
current_client.users.length # => 2
current_client.users.build
current_client.users.count # => 2
current_client.users.length # => 3