需要帮助理解这段代码,据我所知,我知道“<<”附加到集合但在这里它正确保存记录,如果不调用.save方法怎么办?
- #user.rb
- has_many :saved_properties,through: :property_saves,source: :property
- #users_controller.rb
- def update
- if @user.saved_properties << Property.find(params[:saved_property_id])
- render plain: "Property saved"
- end
解决方法
也许查看源代码会对你有所帮助.这是我基于<<<<<<< activerecord中的方法:
- def <<(*records)
- proxy_association.concat(records) && self
- end
rails/collection_proxy.rb at 5053d5251fb8c03e666f1f8b765464ec33e3066e · rails/rails · GitHub
- def concat(*records)
- records = records.flatten
- if owner.new_record?
- load_target
- concat_records(records)
- else
- transaction { concat_records(records) }
- end
- end
rails/collection_association.rb at 5053d5251fb8c03e666f1f8b765464ec33e3066e · rails/rails · GitHub
- def concat_records(records,should_raise = false)
- result = true
- records.each do |record|
- raise_on_type_mismatch!(record)
- add_to_target(record) do |rec|
- result &&= insert_record(rec,true,should_raise) unless owner.new_record?
- end
- end
- result && records
- end
rails/collection_association.rb at 5053d5251fb8c03e666f1f8b765464ec33e3066e · rails/rails · GitHub
- def insert_record(record,validate = true,raise = false)
- set_owner_attributes(record)
- set_inverse_instance(record)
- if raise
- record.save!(validate: validate)
- else
- record.save(validate: validate)
- end
- end
- def insert_record(record,raise = false)
- ensure_not_nested
- if record.new_record? || record.has_changes_to_save?
- if raise
- record.save!(validate: validate)
- else
- return unless record.save(validate: validate)
- end
- end
- save_through_record(record)
- record
- end
免责声明:我不熟悉Rails源代码,但你有一个有趣的问题.