次のスクリプトは、has_manyroles=
属性が常に永続的に機能することを示しています。
私の質問は次のとおりです。
1)この動作の背後にある理由は何ですか:has_many属性が設定された瞬間に永続化されるのはなぜですか?name
なぜこれが通常の属性の動作(次のスクリプト)と異なるのですか?
2)カスタムセッターを記述して、ロールの関連付けを永続化せずに、一連のモデル属性(roles =を含む)にroles=
fxを使用できるようにすることはできますか?assign_attributes
Rails> 3.2で可能であれば、例をいただければ幸いです。
スクリプトは次のとおりです。
gem 'rails', '>=3.2.0' # change as required
gem 'sqlite3'
require 'active_record'
require 'logger'
puts "Active Record #{ActiveRecord::VERSION::STRING}"
ActiveRecord::Base.logger = Logger.new(STDERR)
ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:database => ':memory:'
)
ActiveRecord::Schema.define do
create_table :users, :force => true do |t|
t.string :name
end
create_table :user_roles, :force => true do |t|
t.integer :user_id
t.integer :role_id
end
create_table :roles, :force => true do |t|
t.string :name
end
end
# Create the minimal set of models to reproduce the bug
class User < ActiveRecord::Base
has_many :user_roles
has_many :roles, :through => :user_roles
end
class UserRole < ActiveRecord::Base
belongs_to :user
belongs_to :role
end
class Role < ActiveRecord::Base
end
r = Role.create(:name => 'admin')
u = User.create
# roles= persists its value, name= does not
u.assign_attributes({ :roles => [r], :name => 'Stanislaw' })
# The same behavior is produced by:
# u.attributes=
# u.roles=
puts "name attribute: #{u.name}"
puts "many roles #{u.roles}"
u.reload
puts "name attribute: #{u.name}"
puts "many roles #{u.roles}" # I see admin role and I want to achieve behavior that I would not see it