Ruby on Rails 14章has_many、has_many through

今回はhas_manyとhas_many throughオプションについて

 

修正前のリレーション
・User.rb
has_many :active_relationships,
class_name: “Relationship”,
foreign_key: “follower_id”,
dependent: :destroy

 

has_manyの関係名は
active_relationshipsであり、
Relationshipテーブルのfollower_idと、
自クラスのidが紐づくよという意味。

 

構文や紐づきは以上の通りだが、
使い勝手の面では、

follower_id から followed_idへフォローしているという[関係を表す行]を
[配列]として扱う。

こうなっているとする。
>> u1.id
=> 1
>> u2.id
=> 101
>> u3.id
=> 50

u1がu2,u3をフォローしているとき
u1.active_relationships.create!(followed_id: u2.id)
u1.active_relationships.create!(followed_id: u3.id)

 

u1.active_relationships
[#<Relationship id: 3,
follower_id: 1,
followed_id: 50,
created_at: “2019-09-14 12:04:40”,
updated_at: “2019-09-14 12:04:40”>
,
#<Relationship id: 2,
follower_id: 1,
followed_id: 101,
created_at: “2019-09-14 12:04:35”,
updated_at: “2019-09-14 12:04:35”>
]

(適宜改行したが,[]と<>でオブジェクトを判断するべし。)

followed(つまりフォローしている先)は、relationshipを介して複数あるものの、
あくまでrelationshipを介しての操作になる。

 

★Javaでいえば
List<Relationship> activeRelationships
といえる。

 

has_many :following, through: :active_relationships, source: :followed

has_manyの関係名は、following
参照は
“active_relationships”(上記で出てきたリンク)であり、
Relationshipのfollowed(_idを省略)でつながる。

(※relationshipにもbelong_toで :followedという定義がある。
これも後ろに_idが省略されており、UserのIDとつながる。)

throughでつながることで、1ユーザ当たりを配列で扱えるようになった。

u1.following
[#<User id: 50,
name: “Cynthia Gaylord”,
email: “example-48@railstutorial.org”,
created_at: “2019-08-29 14:16:56”,
updated_at: “2019-08-29 14:16:56”,
password_digest: “$2a$10$anyVoyXJEtUb7hxGqOsCxelR4EHF0ALl4P4UHchOYOC…”,
remember_digest: nil,
admin: false,
activation_digest: “$2a$10$sTjksrpUxj85ki/rQ09W/.ub5lWrUH5xF8tZf3C3IP3…”,
activated: true,
activated_at: “2019-08-29 14:16:56”,
reset_digest: nil,
reset_sent_at: nil>,
#<User id: 101,
name: “test0902”,
email: “test0902@example.com”,
created_at: “2019-09-02 14:42:53”,
updated_at: “2019-09-02 14:42:53”,
password_digest: “$2a$10$yvGwNLepgdtYWRSDQLwpcOpa8dWgegS7m7piiuWswyy…”,
remember_digest: nil,
admin: false,
activation_digest: “$2a$10$3eVgWBa/m4uTIQ1nQHOX8OH84qd9ZXGl3QmwquyoNd0…”,
activated: true,
activated_at: “2019-09-02 14:45:04”,
reset_digest: nil,
reset_sent_at: nil>]

★Javaでいえば
List<User> following
といえる。

 

↓仕掛け
List<Relationship>のRelationship#follower_idを参照
Relationshipのfollower_idがUserとbelong_toなのでUserを参照
してリスト化

u1.follow(u2)
u1.follow(u3)

>follow(user)の実装
#def follow(other)
# following << other if not(following?(other))
#end
#def following?(other)
# following.include?(other)
#end

u1.following

[#<User id: 50,
name: “Cynthia Gaylord”,
email: “example-48@railstutorial.org”,
created_at: “2019-08-29 14:16:56”,
updated_at: “2019-08-29 14:16:56”,
password_digest: “$2a$10$anyVoyXJEtUb7hxGqOsCxelR4EHF0ALl4P4UHchOYOC…”,
remember_digest: nil,
admin: false,
activation_digest: “$2a$10$sTjksrpUxj85ki/rQ09W/.ub5lWrUH5xF8tZf3C3IP3…”,
activated: true,
activated_at: “2019-08-29 14:16:56”,
reset_digest: nil,
reset_sent_at: nil>,
#<User id: 100,
name: “Mr. Tracey Cassin”,
email: “example-98@railstutorial.org”,
created_at: “2019-08-29 14:17:05”,
updated_at: “2019-08-29 14:17:05”,
password_digest: “$2a$10$ZxKa1yj4lofiN0kaUpYvEuXyrbyNT1yoiRnNrIrS80Y…”,
remember_digest: nil,
admin: false,
activation_digest: “$2a$10$tvsQnbOQJVVT3Ji8FVRsquFc5rQZDpKyqbxENGTiYDL…”,
activated: true,
activated_at: “2019-08-29 14:17:05”,
reset_digest: nil,
reset_sent_at: nil>]

u2.followers
[#<User id: 1,
name: “Example User”,
email: “example@railstutorial.org”,
created_at: “2019-08-29 14:16:48”,
updated_at: “2019-08-29 14:16:48”,
password_digest: “$2a$10$BEI/9CFNtk3SXRRacQUpSuPLfqDoOjkPZ0q5VW6FBbk…”,
remember_digest: nil,
admin: true,
activation_digest: “$2a$10$DwIgrutgqt3Bwtf4EBdkVeCv.CdQVIROsieE/M6m3BM…”,
activated: true,
activated_at: “2019-08-29 14:16:48”,
reset_digest: nil,
reset_sent_a : nil>]

u3.followers
[#<User id: 1,
name: “Example User”,
email: “example@railstutorial.org”,
created_at: “2019-08-29 14:16:48”,
updated_at: “2019-08-29 14:16:48”,
password_digest: “$2a$10$BEI/9CFNtk3SXRRacQUpSuPLfqDoOjkPZ0q5VW6FBbk…”,
remember_digest: nil,
admin: true,
activation_digest: “$2a$10$DwIgrutgqt3Bwtf4EBdkVeCv.CdQVIROsieE/M6m3BM…”,
activated: true,
activated_at: “2019-08-29 14:16:48”,
reset_digest: nil,
reset_sent_at: nil>]

 

コメントを残す

メールアドレスが公開されることはありません。