需要帮助理解这段代码,据我所知,我知道“<<”附加到集合但在这里它正确保存记录,如果不调用.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源代码,但你有一个有趣的问题.