Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何通过顺序、查找、位置等调用来保持关系的倒数?_Ruby On Rails_Ruby On Rails 3_Rails Activerecord - Fatal编程技术网

Ruby on rails 如何通过顺序、查找、位置等调用来保持关系的倒数?

Ruby on rails 如何通过顺序、查找、位置等调用来保持关系的倒数?,ruby-on-rails,ruby-on-rails-3,rails-activerecord,Ruby On Rails,Ruby On Rails 3,Rails Activerecord,鉴于以下类与的关系,逆类与有许多关联: class User < ActiveRecord:Base has_many :accounts, inverse_of: :user end class Account < ActiveRecord:Base belongs_to :user end 下面的代码显示,在执行新的sql语句(顺序命中数据库)后,反向关系不会持久化: 如何确保我的用户对象在执行订单、查找、位置等调用后仍然保持不变?如果要保留objects属性但不想保

鉴于以下类与的关系,逆类与有许多关联:

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

class Account < ActiveRecord:Base
  belongs_to :user
end
下面的代码显示,在执行新的sql语句(顺序命中数据库)后,反向关系不会持久化:


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

如果要保留objects属性但不想保存记录,则可以尝试使用
attributes=(new\u attributes)
assign\u attributes(new\u attributes,options={})

就你而言:

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


资料来源:我认为不可能

使用的
inverse\u可以获取用户对象,而无需再次拉动数据库,因此
某些未保存变量
(123)的未保存值将保持不变

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

如果没有
的逆项:

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
u.accounts.first.user.some_not_saved_variable
 #no SQL statement
=> "123" #123 persist
使用的逆函数:

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
u.accounts.first.user.some_not_saved_variable
 #no SQL statement
=> "123" #123 persist
调用
订单
查找
其中
等:

u.accounts.order(:created_at).first.user.some_not_saved_variable 
#SQL to order by created_at
因此,它将始终访问数据库,未保存的值将替换为数据库值

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