ãããã¼ã«å¯¾ãã¦å¤(ããªã¥ã¼)ãæã¤ããããããã¼ããªã¥ã¼ã®ãããªãã¼ã¿æ§é ã¯ããã°ã©ãã³ã°ã§ãã使ãã¾ããRubyã§ãããæ±ãã«ã¯è¤æ°ã®é¸æè¢(HashãStructãOpenStructãDataãClass)ããããRuby on Railsã使ãå ´åããã«ActiveModelãActiveRecordãããã¾ãããã®è¨äºã§ã¯ç§ã®ç¥ã£ã¦ããç¹å¾´ã¨ã使ããããç´¹ä»ãã¾ãã
ãã¡ãã¯Ruby Advent Calendar 2024ã®12/6æ¥åã®è¨äºã§ãã Rubyã¢ããã³ãã«ã¬ã³ãã¼6æ¥ç®ã«æ¸ããããã§ã¯ããã¾ããããRubyã«é¢ä¿ããè¨äºãã¿ã¤ãã³ã°ããå ¬éãããã¨ã«ãªã£ãã®ã¨ããã£ãããªãèªåã好ããªè¨èªã®ã«ã¬ã³ãã¼ãåãããæ°æã«ãªã£ãã®ã§åå ãã¾ããï¼
ã¿ãªããã¯ã©ããã£ã¦ä½¿ãããã¦ãã¾ããï¼ä»¥ä¸ã®ã³ã¼ãä¾ã®ããã«ãã©ãããããªãã«ä¼¼ãåæåã¨ã¢ã¯ã»ã¹ãã§ãã¾ããã
require 'bundler/inline' gemfile do source 'https://rubygems.org' gem 'activemodel', '~> 8.0' end require 'ostruct' require 'active_model' # Hash hash = {a: 1, b: 2, c: 3} hash_a = hash[:a] puts "hash_a is #{hash_a}" # => hash_a is 1 # Struct MyStruct = Struct.new(:a, :b, :c, keyword_init: true) struct = MyStruct.new(a: 1, b: 2, c: 3) struct_a = struct.a puts "struct_a is #{struct_a}" # => struct_a is 1 # OpenStruct open_struct = OpenStruct.new(a: 1, b: 2, c: 3) open_struct_a = open_struct.a puts "open_struct_a is #{open_struct_a}" # => open_struct_a is 1 # Data MyData = Data.define(:a, :b, :c) data = MyData.new(a: 1, b: 2, c: 3) data_a = data.a puts "data_a is #{data_a}" # => data_a is 1 # Class class MyClass attr_reader :a, :b, :c def initialize(a:, b:, c:) @a = a @b = b @c = c end end my_class = MyClass.new(a: 1, b: 2, c: 3) my_class_a = my_class.a puts "my_class_a is #{my_class_a}" # => my_class_a is 1 # Active Model class MyActiveModel include ActiveModel::API attr_accessor :a, :b, :c end my_active_model = MyActiveModel.new(a: 1, b: 2, c: 3) my_active_model_a = my_active_model.a puts "my_active_model_a is #{my_active_model_a}" # => my_active_model_a is 1 # Active Record # (ã»ããã¢ãããå¿ è¦ãªã®ã§ãã®åç´ãªã¹ã¯ãªããã§ã¯è¡¨ç¾ã§ããªãã£ã><)
ç§ã¯ãã夿ãã¦ã¾ã
Ruby on Railsã使ã£ã¦ããå ´åãåæã¨ãã¦ãã¾ãããRubyã®ã¿ã§èãã¦ããããªãã«æ©è½ãã¾ãã Ruby on Railsãç¨ããWebããã°ã©ãã³ã°ã§ãã®æ¯ãåãã«å¾ãã¨ããã¡ããå ´åã«ãã£ã¦ç°ãªãã¾ããã7-8å²ãActiveRecordã1-2å²ãHashãæ®ãããã®ä»ãããã®ç»å ´äººç©ã«ãªãæè¦ã§ãã
graph TD A([ã¯ã©ã¹é¸æ]) --> B{RDBã®èªã¿æ¸ãã«ä½¿ãããï¼} B --> |ã¯ã| ActiveRecord([ActiveRecord]) B --> |ããã| C{åãå¤ãä¿æãã¦ãããªãåãç©ã¨èãããï¼} C --> |ã¯ã| D[éClassç³»] D --> E{Hashã®æè»ããå¶éãããï¼} E --> |ã¯ã| F{Ruby3.2以ä¸ï¼} E --> |ããã| Hash([Hash]) F --> |ã¯ã| Data([Data]) F --> |ããã| Struct([Struct]) C --> |ãããï¼ããã ãã§ã¯è¶³ããªãï¼| G[Classç³»] G --> H{ActiveRecordã«ä¼¼ãä½¿ãæ¹ããããï¼} H --> |ã¯ã| ActiveModel([ActiveModel]) H --> |ããã| Class([Class])
RDBã®èªã¿æ¸ãã«ä½¿ãããï¼
ããããã¯ããã®å ´åã¯ActiveRecordã使ãã¾ãããã 夿ã«è¿·ãã®ã¯ããããããã®å ´åã®RDBã«èªã¿æ¸ãããªãå ´åã®é¸æè¢ã«ãªãã¨æãã¾ãã
åãå¤ãä¿æãã¦ãããªãåãç©ã¨èãããï¼
åãå¤ãæã£ã¦ãããªãtrueã«ãªãHashãStructãDataã®ã°ã«ã¼ãã¨ãåãå¤ãæã£ã¦ããã ãã§ã¯trueã«ãªããªãClassã®ã°ã«ã¼ããããã¾ãã Classã®ã»ãã¯èªåã§ãåããã¨ããã®ãä½ãªã®ãå®ç¾©ããªããã°ããã¾ããã
åã«å¤ã ãã§æ¯è¼ãã¦ããå ´åã¯ããã©ã«ãã§ãã¾ãæ±ããåè ã®ã°ã«ã¼ãã使ãã¾ãããã
require 'bundler/inline' gemfile do source 'https://rubygems.org' gem 'activemodel', '~> 8.0' end require 'active_model' ## éClass ç³»ã¯çãããªã # Hash p({a:1, b:2, c:3} == {a:1, b:2, c:3}) # => true # Struct MyStruct = Struct.new(:a, :b, :c, keyword_init: true) p(MyStruct.new(a:1, b:2, c:3) == MyStruct.new(a:1, b:2, c:3)) # => true # Data MyData = Data.define(:a, :b, :c) p(MyData.new(a:1, b:2, c:3) == MyData.new(a:1, b:2, c:3)) # => true ## Class ç³»ã¯çãããªããªã # Class class MyClass def initialize(a:, b:, c:) @a = a @b = b @c = c end end p(MyClass.new(a:1, b:2, c:3) == MyClass.new(a:1, b:2, c:3)) # => false # ActiveModel class MyActiveModel include ActiveModel::API attr_accessor :a, :b, :c end p (MyActiveModel.new(a:1, b:2, c:3) == MyActiveModel.new(a:1, b:2, c:3)) # => false
Hashã®æè»ããå¶éãããï¼
èªã¿æãçè§£ããããããã°ã©ã ã¯ãæ¸ãæã®æå³ãã³ã¼ãããèªã¿ã¨ãããã®ã§ãããã æ¸ãæããããããã§ããªãããã¨ãå¤ããã®ã使ã£ã¦ä½ãã表ç¾ãã¦ããã¨ããããããã¯æå³ãå¼·ãæãã¨ããã¨ãã§ãã¾ãã
Hashã¯ä»åã®é¸æè¢ã®ä¸ã§ä¸çªç´ æ´ã§æè»ãªã¯ã©ã¹ã§ãã Hashã®ãªãã§ãåããããããæãããã¯ããã便å©ãªä¸æ¹ã§ãåããããå¶éãã¦ãã§ããªãããæç¤ºãããã¨ã§èªã¿ãããããã°ã©ã ã«ãªããã¨ãå¤ãã§ãã
æ¸ãæã®æå³ãèªã¿æã«ååã«ä¼ããèªä¿¡ãæã¦ãªãå ´æã§ã¯Hash以å¤ãæ¤è¨ãã¦ããã¨æãã¾ãã
Hashã§ãååãªã®ã¯ãä¾ãã°æ¸ãæ¨ã¦ããã¹ã¯ãªããã§ããã¨ããç¹å®ã®çãã¡ã½ããã®ä¸ã§ã®ã¿å©ç¨ãããã¼ã¿ã§ãã ãããã¯Hashãã©ããªãã®ãåãããããã¯ãããã°ã®ã³ã¼ããè¦ãã¨ãããã®ã§èªã¿æã誤解ãã«ããã§ãã
ã¤ã³ã¹ã¿ã³ã¹å¤æ°ãã¡ã½ããã®å¼æ°ãªã©ã¯Hashã§ååãªå ´åãããã¾ããHash以å¤ãæ¤è¨ãã¦ãããã§ããããåºãç¯å²ã§ã®å©ç¨ãè¦è¾¼ã¾ããããããã¾ãã¾ãªèªã¿æãæ¸ãæã®æå³ããã¾ãæãã¨ãããã䏿çã«ãªã£ã¦ããããã§ãã
ã©ãã¾ã§ãHashã§ããã¦ãã©ãããã¯Hashã§ã¯ãªãã»ãããããã¯ãããã°ã©ã ã®ç¨®é¡ãããã°ã©ã ã®ç®çãæ¸ãæã¨èªã¿æã®é¢ä¿æ§ãä¿®æ£ã®é »åº¦ãlanguage serverãªã©ããã°ã©ãã³ã°ãè£å©ãã¦ããããã¼ã«ã®å®æåº¦ãªã©æ§ã ãªè¦å ã«ãã£ã¦å¤ããã®ã§ä¸æ¦ã«ã¯è¨ããããã®å¤æã¨ããã®ã¯ç§ã«ã¨ã£ã¦ã¯é¢åã§ãããã¾ããããã°ã©ãã³ã°ã®ãããããã¤ã³ãã ã¨æãã¦ãã¾ãã
Ruby3.2以ä¸ï¼
Ruby3.2ããDataã¯ã©ã¹ã使ããããã«ãªãã¾ããã
Dataã¯ã©ã¹ã¯Structã¯ã©ã¹ã«æ¯ã¹ã¦ãåæå¤ããå¤ãå¤ãããã¨ãã§ããªãã¨ããå¶éãã¤ãã¦ãã¾ãããéã«åæå¤ãè¦ãã°å ¥ã£ã¦ããå¤ãæ³åããããã®ã§èªã¿æã«ã¨ã£ã¦ã¯åªããã§ãã使ããå ´åã¯ãã¡ãã使ãã¾ãããã
Structã¯ã©ã¹ã¯åæå以éãå¤ãå ¥ãæ¿ãããã¨ãã§ããã®ã§ããããã£ãç¨éã®å ´åã¯Structã¯ã©ã¹ãããã§ãã ãã ããã°ã©ã ã®çè§£ããããã®è¦³ç¹ã§ããã¨ãåæå以éãå¤ãå ¥ãæ¿ããªãã使ãããã°ã©ã ã¯ãã£ã¨è¦éããããã§ããªãããæ¸ããªãããªããæ¤è¨ãã¦ããããã§ãã
ãªãã¸ã§ã¯ããåå©ç¨ãããã¨ã§ããªãã¸ã§ã¯ãã®æ°ãå¢ãããããªãã·ã¹ãã ã«ããããããã°ã©ã ãæ¸ããã¨ãã§ããã¨ãã観ç¹ã¯ããã®ã§ãããããã¯æé©åã®ã¨ãã«èãããã¨ã§ããã®è¨äºãèªãã§ããã¦ãã人ã«ä¸çªå©ãã«ãªãã®ã¯è¨ããã£ã¡ãããã¨ããªã¨æã£ã¦ææ³å¼·ããªå¤æè»¸ã«ãã¦ãã¾ãããããâãã
ActiveRecordã«ä¼¼ãä½¿ãæ¹ããããï¼
Ruby on Railsã使ã£ã¦ããå ´åã¯ActiveRecordã«å¯¾ãã¦ã®å¦çã大åãå ããã¨æãã¾ãã RDBããã®èªã¿æ¸ããããªãå ´åã§ãActiveRecordã«ä¼¼ãæä½ãã§ããã¨ããã°ã©ã ã®æ¸ãæãå¦çãç°¡ç¥åã§ãã¾ãããèªã¿æãActiveRecordã«ããæ¢åã®æ©è½ã使ã£ã¦ããã®ã ãªã¨æ¯èããçè§£ããããã§ãã
ã¯ã©ã¹ã®ç´¹ä»
ããã¾ã§ã§ç´¹ä»ããã¯ã©ã¹ã®ããããã®ç¹å¾´ããåå¥ã«å®è¡å¯è½ãªã³ã¼ããã¤ãã¦ç´¹ä»ãã¾ãã
Hash
ãªãã¡ã¬ã³ã¹ã¯ https://docs.ruby-lang.org/ja/latest/class/Hash.html ã«ããã¾ãã
ä»ååæãããªãã§ä¸çªç´ æ´ã§æè»ãªã¯ã©ã¹ã§ãã ã¾ã { a: 1, b: 2 } ã®ãããªãªãã©ã«ãåãã¦ãã¾ãã æ ¼ç´ããããªã¥ã¼ã¸ã®ã¢ã¯ã»ã¹ã hash[:a] ã®ãããªå½¢ã«ãªãããã®å¾ç´¹ä»ãã object.a ã¨ãã£ãå½¢å¼ã¨ç°ãªãã¾ã
ä»ã®ã¯ã©ã¹ã§ã®æ¯èã®ã»ã¨ãã©ãã«ãã¼ã§ãã¦ãã¾ãæè»æ§ãåãã¦ãã¾ããããªãã§ãã§ãã¦ãã¾ãã¨å°ããã¨ãããã¾ãã ä¾ãã°ãããã°ã©ãã«ãããã¼ã®æ¸ãééããªã©ããã®ã¾ã¾åãããã¦ãã¾ããããééãã«æ°ã¥ããªããã¨ãããã¾ãã
ã¾ããä½ã®ããã®ãã®ãã®åä»ããå¼·ãæèããªãã¦ãéç¨ã§ãã¦ãã¾ããããæ¸ãæãæ³¨ææ·±ãã³ã¼ãã£ã³ã°ããªããã°èªã¿æã«æ å ±ãä¼ããã«ããã§ãã
diggle_taro = {first_name: 'Taro', last_name: 'Diggle'} p diggle_taro[:first_name] # => "Taro" # æ¬å½ã¯ diggle_taro[:first_name] ã¨æ¸ãããã£ããã©ãééãã¦ãã¾ã£ãã±ã¼ã¹ãç¹ã«ã¨ã©ã¼ã«ã¯ãªããééãã«æ°ã¥ãã«ãã diggle_taro[:firstname] = 'Jiro' p diggle_taro # => {first_name: "Taro", last_name: "Diggle", firstname: "Jiro"} # æ¬å½ã¯ diggle_taro[:last_name] ã¨æ¸ãããã£ããã©ãééãã¦ãã¾ã£ãã±ã¼ã¹ãç¹ã«ã¨ã©ã¼ã«ã¯ãªããééãã«æ°ã¥ãã«ãã p diggle_taro[:lastname] # => nil # ãããä½ã表ãã¦ãããã®ãªã®ããã¯ã©ã¹åããå¤å¥ãããã¨ã¯ã§ããªã p diggle_taro.class # => Hash
æ¸ãæã¨èªã¿æã®æå³ãå¼·ãæãå°ããªã¹ã³ã¼ãã®ç¯å²ã§ä½¿ãããã©ããªãã¼ãæã¤ããã³ã¼ãã宿ãããæç¹ã§ã¯è¦å®ãã«ããã¨ããã§ä½¿ãã®ã«é©ãã¦ãã¾ãã
åè ã¯æ¸ãæ¨ã¦ããã¹ã¯ãªããã§ããã¨ããç¹å®ã®çãã¡ã½ããã®ä¸ã§ã®ã¿å©ç¨ãããã¼ã¿ã該å½ãã¾ããå¾è ã¯ãªã¯ã¨ã¹ãã®ãã©ã¡ã¼ã¿ã¼ãªã©ã該å½ãã¾ãã
Class
ãªãã¡ã¬ã³ã¹ã¯ https://docs.ruby-lang.org/ja/latest/class/Class.html ã«ããã¾ãã
Rubyã«ã¯ãHashã®ããã«ãã¼ã¿ã®ã¿ãæ±ãçãã®ãã®ã¨ããã¼ã¿ã¨ããã«ä¼´ãæä½ãã¾ã¨ãããããããå¤ãªãã¸ã§ã¯ãã¨ãããã®ã®ä¸¡æ¹ãä½ãã¾ãã
Classã¯ãã¼ã¿ã¨ããã«ä¼´ãæä½ãã¾ã¨ããããã®ä»£è¡¨çãªåå¨ã§ãã
Hashã¨ã¯ç°ãªãããã°ã©ãã«ãããã¼ã®æ¸ãééããªã©ã¯ã¨ã©ã¼ã«ãªãã®ã§æ°ã¥ããã¨ãã§ãã¾ãã
ãªãã¸ã§ã¯ãã®ã¯ã©ã¹åããããã®ã§ãä½ã表ãã¦ãããã®ãçè§£ããããã§ãã
class Name attr_reader :first_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def full_name "#{@first_name} #{@last_name}" end end diggle_taro = Name.new('Taro', 'Diggle') p diggle_taro.full_name # => "Taro Diggle" p diggle_taro.class # => Name # family_name ã¨ããã¡ã½ããã¯åå¨ããªããããã¨ã©ã¼ãçºçãã begin diggle_taro.family_name rescue => e p e # => #<NoMethodError: undefined method 'family_name' for an instance of Name> end # ã¯ã©ã¹ã®å ´åãçããã¨ããã®ã¯ãªãã¸ã§ã¯ãã®idãä¸è´ãã¦ãããã©ããã§å¤æããã # åããã¼ã¿ãæã¤ãã®ããçãããã¨è¦ãªãããã«ã¯ä¸æéå¿ è¦ diggle_taro2 = Name.new('Taro', 'Diggle') p diggle_taro.object_id # => 16 p diggle_taro2.object_id # => 24 p diggle_taro == diggle_taro2 # => false
Struct
ãªãã¡ã¬ã³ã¹ã¯ https://docs.ruby-lang.org/ja/latest/class/Struct.html ã«ããã¾ãã
ãã¼ã¿ã®æ ¼ç´ã主ç®çãªã®ã§ãå½¹å²ã¯Hashã«è¿ãã§ãã䏿¹ã§ãããããå®ç¾©ãããã¼ããåãã¤ããªãã¨ããã{ a: 1, b: 2 } ã®ãããªãªãã©ã«ããªãã¨ãããstruct.a ã®ãããªã¢ã¯ã»ãµãæã¤ã¨ãããã¯ã©ã¹åãã¤ããããç¹ãªã©ã¯Classã®ç¹æ§ã«è¿ãã§ãã
Structã«ã¯æ¯ãã¾ãã追å ãããããã«ã³ã¼ãè¨è¨ããã¦ãã¦ãnewã«ãããã¯å¼æ°ãã¨ã£ã¦ãã®ä¸ã§å®ç¾©ãå¯è½ã§ãã
Classã¨ã¯ç°ãªãããªãã¸ã§ã¯ããçããããä¿æãã¦ãããã¼ã¿ãçãããã§å¤å®ããã®ã§ããã¼ã¿ã®å ¥ãç©ã¨ãã¦ã¯æ±ããããã§ãã
ã³ã¼ããæ¸ããæç¹ã§ã©ããªãã¼ãå¿ è¦ãããã£ã¦ããã¨ãã§ãããç¨åº¦è²ã ãªã¨ããã«ãã¼ã¿ãåãåãå ´åã«ã¯Structãããããããã¾ããã
Name = Struct.new(:first_name, :last_name) do def full_name "#{self.first_name} #{self.last_name}" end end diggle_taro = Name.new('Taro', 'Diggle') # ãªãã¸ã§ã¯ããä¿æãããã¼ã¿ã®æä½(ã¡ã½ãã)ãä¸ç·ã«æ±ãã # Name.full_name(diggle_taro) ãªã©ã¨ããªãã¦ãã p diggle_taro.full_name # => "Taro Diggle" # ãã®ãªãã¸ã§ã¯ããä½ã表ãã¦ãããã®ãªã®ããã¯ã©ã¹åããå¤å¥ãããã¨ãã§ãã p diggle_taro.class # => Name # family_name ã¨ããã¡ã½ããã¯åå¨ããªããããã¨ã©ã¼ãçºçãã # ããã°ã©ããééãã¦ãã¨ã©ã¼ãçºçããã®ã§ãé»ã£ã¦åãå ¥ããããããã¯ééãã«æ°ã¥ãããã begin diggle_taro.family_name rescue => e p e # => #<NoMethodError: undefined method 'family_name' for an instance of Name> end # Structã®å ´åãClass ã¨ç°ãªãããã©ã«ãã§åããã¼ã¿ãæã¤ãã®ããçãããã¨ã¿ãªãããã«ãªã£ã¦ãã diggle_taro2 = Name.new('Taro', 'Diggle') p diggle_taro.object_id # => 16 p diggle_taro2.object_id # => 24 p diggle_taro == diggle_taro2 # => true
OpenStruct
ãªãã¡ã¬ã³ã¹ã¯ https://docs.ruby-lang.org/ja/latest/class/OpenStruct.html ã«ããã¾ãã
Structã¯ãããããå®ç¾©ãããã¼ã®ã¿åãã¤ããã®ã«å¯¾ããOpenStructã¯æªå®ç¾©ã®ãã¼ãåãã¤ãã¾ãã ååã«åãã¦æ§è³ªã¯StructããHashã«è¿ããã¢ã¯ã»ã¹æ¹æ³ã object.a ã®å½¢å¼ã§è¡ããããã«ãªã£ãæ¡å¼µHashã ã¨æãã¦ãã¾ãã
ããæ§è³ªãä¼¼ã¦ãããªãç´ æ´ãã¤requireã®å¿ è¦ãªãHashã®ã»ãã使ããããªã¨æã£ã¦ãã¾ãããããã£ãæå³ã§ç§ãã©ãã使ãããèæ ®ããã¨ãã«OpenStructã¯åè£ã«å ¥ã£ã¦ãã¾ããã ããOpenStructããã便å©ã«ä½¿ã£ã¦ãããã¨ãããæè¦ããOpenStructãããªã¨ããã§æ´»èºãã¦ãããã¨ããæ å ±ãããã°ãã²æãã¦ãã ããã
require 'ostruct' diggle_taro = OpenStruct.new(first_name: 'Taro', last_name: 'Diggle') # æ¬å½ã¯ diggle_taro.first_name ã¨æ¸ãããã£ããã©ãééãã¦ãã¾ã£ãã±ã¼ã¹ãç¹ã«ã¨ã©ã¼ã«ã¯ãªããééãã«æ°ã¥ãã«ãã diggle_taro.firstname = 'Jiro' p diggle_taro # => #<OpenStruct first_name="Taro", last_name="Diggle", firstname="Jiro"> # æ¬å½ã¯ diggle_taro.last_name ã¨æ¸ãããã£ããã©ãééãã¦ãã¾ã£ãã±ã¼ã¹ãç¹ã«ã¨ã©ã¼ã«ã¯ãªããééãã«æ°ã¥ãã«ãã p diggle_taro.lastname # => nil # ãããä½ã表ãã¦ãããã®ãªã®ããã¯ã©ã¹åããå¤å¥ãããã¨ã¯ã§ããªã p diggle_taro.class # => OpenStruct
Data
ãªãã¡ã¬ã³ã¹ã¯ https://docs.ruby-lang.org/ja/latest/class/Data.html ã«ããã¾ãã
Ruby3.2ããå°å ¥ãããæ°ããæ¹æ³ã§ãã Structã«ä¼¼ã¦ãã¾ãããçææã«å ¥åãããã¼ã¿ãæ¸ãæãããã¨ãã§ããªãç¹ãç°ãªãã¾ãã
ã§ãããã¨ãå°ãªããªã£ã¦ããã®ã¯æªããã¨ã§ã¯ãªããæ¸ãæãæå³ãã¦ããä½¿ãæ¹ãããã¯ã£ããã¨èªã¿æã«ä¼ããã¾ãã
Name = Data.define(:first_name, :last_name) do def full_name "#{self.first_name} #{self.last_name}" end end diggle_taro = Name.new('Taro', 'Diggle') # ãªãã¸ã§ã¯ããä¿æãããã¼ã¿ã®æä½(ã¡ã½ãã)ãä¸ç·ã«æ±ãã # Name.full_name(diggle_taro) ãªã©ã¨ããªãã¦ãã p diggle_taro.full_name # => "Taro Diggle" # ãã®ãªãã¸ã§ã¯ããä½ã表ãã¦ãããã®ãªã®ããã¯ã©ã¹åããå¤å¥ãããã¨ãã§ãã p diggle_taro.class # => Name # family_name ã¨ããã¡ã½ããã¯åå¨ããªããããã¨ã©ã¼ãçºçãã # ããã°ã©ããééãã¦ãã¨ã©ã¼ãçºçããã®ã§ãé»ã£ã¦åãå ¥ããããããã¯ééãã«æ°ã¥ãããã begin diggle_taro.family_name rescue => e p e # => #<NoMethodError: undefined method 'family_name' for an instance of Name> end # Dataã®å ´åãClass ã¨ç°ãªãããã©ã«ãã§åããã¼ã¿ãæã¤ãã®ããçãããã¨ã¿ãªãããã«ãªã£ã¦ãã diggle_taro2 = Name.new('Taro', 'Diggle') p diggle_taro.object_id # => 16 p diggle_taro2.object_id # => 24 p diggle_taro == diggle_taro2 # => true # Dataã®å ´åãStruct ã¨ç°ãªãå¤ãæ¸ãæãããã¨ãã§ããªã begin diggle_taro.first_name = 'Jiro' rescue => e p e # => #<NoMethodError: undefined method 'first_name=' for an instance of Name> end # æ°ãããã®ãä½ãwithã¡ã½ãããæºåããã¦ãã diggle_jiro = diggle_taro.with(first_name: 'Jiro') p diggle_taro # => #<data Name first_name="Taro", last_name="Diggle"> p diggle_jiro # => #<data Name first_name="Jiro", last_name="Diggle">
Active Record
æ¦è¦³ãã¤ããã«ã¯ãªãã¡ã¬ã³ã¹ããRailsã¬ã¤ããããã¨æãã¾ãã®ã§Active Record ã®åºç¤ãã©ããã è¨ããã¨ç¥ããRailsã®å¼·åãªã©ã¤ãã©ãªã§ãã
Ruby on Railsã使ã£ã¦ãã¦ãå¤ããªã¯ã¨ã¹ããã»ãã·ã§ã³ã®éã ãä¿æããã®ã§ã¯ãªãæ°¸ç¶çã«RDBã¸ä¿åããå ´åã®ã»ã¨ãã©ã®ã±ã¼ã¹ãã«ãã¼ãã¦ãã¾ãããã¡ãã使ãã¾ãããã
Active Model
Active Model ã®åºç¤ãã©ãããActive Modelã¯ãRDBã«ä¿åããªãããã©Active Record風ã®ãªãã¸ã§ã¯ããä½ãããã¨ãClassãæ¡å¼µããã®ã«ä¾¿å©ã§ãã
require 'bundler/inline' gemfile do source 'https://rubygems.org' gem 'activemodel', '~> 8.0' end require 'active_model' class Name include ActiveModel::API attr_accessor :first_name, :last_name validates :first_name, :last_name, presence: true def full_name "#{@first_name} #{@last_name}" end end diggle_taro = Name.new(first_name: 'Taro', last_name: 'Diggle') p diggle_taro.full_name # => "Taro Diggle" p diggle_taro.class # => Name # ActiveModelã使ã£ã¦ããªãã¼ã·ã§ã³ããããªãã¼ã·ã§ã³ã®ã¨ã©ã¼ãè¦å´ããå¾ããã¦ãã diggle_taro2 = Name.new(first_name: 'Taro') p diggle_taro2.valid? # => false p diggle_taro2.errors.full_messages # => ["Last name can't be blank"]
ã¾ã¨ã
ä¼¼ããããªãã¨ã®ã§ããã¯ã©ã¹ãè¤æ°ãããªããéãã«çç®ãã¦ã©ã使ããããããç´¹ä»ãã¾ããã
ããã¯ç§ãWebããã°ã©ãã³ã°ãã¦ããä¸ã§ã®çµé¨ãå ã«ãã¦ããã®ã§ãRubyã使ã£ã¦ãã¦ãç°ãªãWebããã°ã©ãã³ã°ããç°ãªãããã°ã©ãã³ã°é åã®å ´åã«ã¯å¥ã®é¸æè¢ãåãå£ãããã¨æãã¾ããããå¥ã®æè¦ãããã°ã¿ãªãããããã°ãªã©ã«æ¸ãã¦æãã¦ããããã¨ç§ãå¬ããã§ãï¼
ãã®è¨äºã«èå³ããã£ã¦æ¥½ããèªãã§ãã ããæ¹ã¯ãæ¸ãæã®ç«å ´ã§ããã¨ãã«èªã¿æã®ãã¨ãå¼·ãèæ ®ã«å ¥ããããæ¹ãªã®ããªã¨æã£ã¦ãã¾ãã ãã®æ¦å¿µãæ¡å¼µããã¨ãã·ã¹ãã ãä½ãç«å ´ã§ããã¨ãã«ä½¿ãå´ã®ã¦ã¼ã¶ã¼ã®ãã¨ãå¼·ãèæ ®ã«å ¥ããããæ¹ã¨ãè¨ãããã§ãã
DIGGLEã§ã¯ãããã£ãåãã¨ãæã®ç«å ´ã®äººã«æããå¯ããªããããã°ã©ãã³ã°ã§ããWebã¨ã³ã¸ãã¢ãæè¿ãã¦ãã¾ããèå³ããã£ã¦ãããæ¹ã¯ãã² https://herp.careers/v1/diggle/_dgvcOQcFfeq ããå¿åãã¦ãã ããã絶対çãªæ£è§£ã¨ãããã®ã¯ãªãä¸ã§ãèªåéã«ã¨ã£ã¦ãããã¾ãããæ¹ãæ¨¡ç´¢ããªããã·ã¹ãã ãä¸ç·ã«ä½ãã¾ãããã
niku ããéããã¾ããã