如何通过order、find、where等调用来持久化反向关系?(注:该内容为一个提问标题,无需回答)

3

以下是具有反向一对多关联的类:

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

如何确保在执行 order、find、where 等调用后,我的用户对象仍然保持不变?

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=


0

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

inverse_of 允许您获取用户对象而无需再次拉取数据库,因此未保存的值 some_not_saved_variable(123)将保留。

但是,如果您调用 orderfindwhere 等方法,则会生成 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

调用orderfindwhere等函数:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接