स्वीकृत उत्तर आम तौर पर यह सब कवर करता है, लेकिन मैं कुछ जोड़ना चाहता हूं, बस आप को अपडेट करने की तरह से मॉडल के साथ काम करने की योजना बना रहे हैं, और आप एक एकल रिकॉर्ड प्राप्त कर रहे हैं (जिसका id
आपको पता नहीं है), फिर find_by
है जाने का रास्ता, क्योंकि यह रिकॉर्ड को पुनः प्राप्त करता है और इसे एक सरणी में नहीं डालता है
irb(main):037:0> @kit = Kit.find_by(number: "3456")
Kit Load (0.9ms) SELECT "kits".* FROM "kits" WHERE "kits"."number" =
'3456' LIMIT 1
=> #<Kit id: 1, number: "3456", created_at: "2015-05-12 06:10:56",
updated_at: "2015-05-12 06:10:56", job_id: nil>
irb(main):038:0> @kit.update(job_id: 2)
(0.2ms) BEGIN Kit Exists (0.4ms) SELECT 1 AS one FROM "kits" WHERE
("kits"."number" = '3456' AND "kits"."id" != 1) LIMIT 1 SQL (0.5ms)
UPDATE "kits" SET "job_id" = $1, "updated_at" = $2 WHERE "kits"."id" =
1 [["job_id", 2], ["updated_at", Tue, 12 May 2015 07:16:58 UTC +00:00]]
(0.6ms) COMMIT => true
लेकिन अगर आप उपयोग करते हैं where
तो आप इसे सीधे अपडेट नहीं कर सकते
irb(main):039:0> @kit = Kit.where(number: "3456")
Kit Load (1.2ms) SELECT "kits".* FROM "kits" WHERE "kits"."number" =
'3456' => #<ActiveRecord::Relation [#<Kit id: 1, number: "3456",
created_at: "2015-05-12 06:10:56", updated_at: "2015-05-12 07:16:58",
job_id: 2>]>
irb(main):040:0> @kit.update(job_id: 3)
ArgumentError: wrong number of arguments (1 for 2)
ऐसे मामले में आपको इसे इस तरह निर्दिष्ट करना होगा
irb(main):043:0> @kit[0].update(job_id: 3)
(0.2ms) BEGIN Kit Exists (0.6ms) SELECT 1 AS one FROM "kits" WHERE
("kits"."number" = '3456' AND "kits"."id" != 1) LIMIT 1 SQL (0.6ms)
UPDATE "kits" SET "job_id" = $1, "updated_at" = $2 WHERE "kits"."id" = 1
[["job_id", 3], ["updated_at", Tue, 12 May 2015 07:28:04 UTC +00:00]]
(0.5ms) COMMIT => true
find_by
पदावनत नहीं किया जाता है, लेकिन वाक्यविन्यास थोड़ा बदल रहा है। सेfind_by_name("Bob")
करने के लिएfind_by(:name, "Bob")
।