Rails allows using aliased attributes with insert_all and upsert_all
source link: https://blog.saeloun.com/2022/06/07/rails-allows-aliases-wthinsert-and-update-all
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Rails allows using aliased attributes with insert_all and upsert_all
Jun 7, 2022 , by Murtaza Bagwala
1 minute read
All of us would have used aliases with SQL queries as it makes the table and column names more readable. The renaming is just a temporary change and the table name does not change in the original database.
Rails now support aliased attributes with insert_all
and upsert_all
,
which means we can add aliases in the Active Record model.
For example,
here we are adding an alias name
to
the original title
attribute of Product
class Product < ApplicationRecord
alias_attribute :name, :title
end
Before
=> Product.insert_all [{ name: "Detergent", description: "A mixture of surfactants with cleansing properties" }], returning: :name
=> /Users/murtazabagwala/.rvm/gems/ruby-3.0.2/gems/activerecord-7.0.3/lib/active_record/insert_all.rb:264:in `extract_types_from_columns_on': unknown attribute 'name' for Product. (ActiveModel::UnknownAttributeError)
We can notice,
it throws an error
saying unknown attribute name
.
After
=> Product.insert_all [{ name: "Detergent", description: "A mixture of surfactants with cleansing properties" }], returning: :name
Product Insert (2.2ms) INSERT INTO "products" ("title","description","created_at","updated_at") VALUES ('Detergent', 'A mixture of surfactants with cleansing properties', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) ON CONFLICT DO NOTHING RETURNING "title" AS "name"
=> #<ActiveRecord::Result:0x00007f921ae855e0 @column_types={}, @columns=["name"], @hash_rows=nil, @rows=[["Detergent"]]>
Aliased attributes also work with upsert_all
=> Product.upsert_all [{ id: 1, name: "Soap"}]
Product Upsert (4.7ms) INSERT INTO "products" ("id","title","created_at","updated_at") VALUES (1, 'Soap', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) ON CONFLICT ("id") DO UPDATE SET updated_at=(CASE WHEN ("products"."title" IS NOT DISTINCT FROM excluded."title") THEN "products".updated_at ELSE CURRENT_TIMESTAMP END),"title"=excluded."title" RETURNING "id"
=> #<ActiveRecord::Result:0x00007f92185c5650 @column_types={}, @columns=["id"], @hash_rows=nil, @rows=[[1]]>
As it can be seen,
it does not throw an error
while using aliased attributes with insert_all
and upsert_all
.
Note: The enhancement is yet to be released in the official Rails version
Check out the PR for more details.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK