3

inverse-has-many-association を持つ次のクラスがあるとします。

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

order、find、where などの呼び出しを実行した後も、ユーザー オブジェクトが同じままであることを確認するにはどうすればよいですか?

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_attributesおよびattributes=

于 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

orderfind、などを呼び出すwhere:

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

したがって、常にデータベースにアクセスし、保存されていない値はデータベースの値に置き換えられます。

于 2013-02-06T11:54:06.947 に答える