给出以下具有反多次关联的类:
class User < ActiveRecord:Base
has_many :accounts, inverse_of: :user
end
class Account < ActiveRecord:Base
belongs_to :user
end
任何给定的User对象加载如下:
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
如何确保我的用户对象在执行订单,查找,在哪里等之后仍然保持不变?
答案 0 :(得分: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"
答案 1 :(得分: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
因此,它将始终访问数据库,未保存的值将被数据库替换。