3

给定以下具有inverse-has-many-association 的类:

class User < ActiveRecord:Base
  has_many :accounts, inverse_of: :user
end

class Account < ActiveRecord:Base
  belongs_to :user
end

并且任何给定的用户对象加载如下:

u = User.first
u.some_not_saved_variable = "123"

下面的代码展示了执行新的sql语句(订单命中数据库)后,逆向关系没有被持久化:

u.accounts.first.user.some_not_saved_variable                       #=> "123"
u.accounts.order(:created_at).first.user.some_not_saved_variable    #=> nil

在执行订单、查找、位置等调用后,如何确保我的用户对象仍然保持不变?

4

2 回答 2

1

如果您想保留对象属性但不想保存记录,那么您可以尝试使用attributes=(new_attributes)assign_attributes(new_attributes, options = {})

在你的情况下:

u = User.first
u.attributes= :some_not_saved_variable => "123"

或者

u = User.first
u.assign_attributes :some_not_saved_variable => "123"

来源: assign_attributesattributes=

于 2013-02-06T11:44:20.467 回答
0

我不认为这是可能的...

允许您在inverse_of不再次拉取数据库的情况下获取用户对象,因此some_not_saved_variable(123) 的未保存值将持续存在。

但是,如果您调用order, find,where等,将生成一条 SQL,并且存储的数据将替换未保存的数据。

没有inverse_of

u.accounts.first.user.some_not_saved_variable
 #SELECT "accounts".* FROM "accounts" WHERE "accounts"."user_id" = 1 LIMIT 1
 #SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
=> "database value" #123 will be lost

使用inverse_of

u.accounts.first.user.some_not_saved_variable
 #no SQL statement
=> "123" #123 persist

调用order, find,where等:

u.accounts.order(:created_at).first.user.some_not_saved_variable 
#SQL to order by created_at

因此,它将始终访问数据库,并且未保存的值将被数据库替换。

于 2013-02-06T11:54:06.947 回答