我有两个关于ActiveRecords的问题:
1)
假设我有一个包含多个用户的应用程序,每个用户都有一张个人资料照片。
我希望用户能够与他们的朋友拥有相同的个人资料照片:这会产生一个多关系,其中一张照片可以是许多用户的个人资料照片。
当我必须在rails中创建关联时,我必须写下这样的内容:
class User < ActiveRecord::Base
belongs_to :photo
end
class Photo < ActiveRecord::Base
has_many :Users
end
现在这对我来说有点奇怪,因为在这种情况下照片属于多个用户,而不是属于一张照片的多个用户。
我这样做错了,还是我对铁轨术语的思考?
2)
新案例:
假设用户可以拥有一张个人资料照片。在这种情况下,照片不能在用户之间共享,因此关系是1比1。
我还想添加一个可以包含照片的帖子实体,这张照片可以被用户用作个人资料照片。
这是最终实现的样子:
class User < ActiveRecord::Base
has_one :photo
end
class Photo < ActiveRecord::Base
belongs_to :user
belongs_to :post
end
class Post < ActiveRecord::Base
has_one: Photo
end
通过查看Rails Documentation,似乎创建一对一关系的唯一方法是将两个外键放在Photo表中:一个用于Post,一个用于User。
但是我想在Photo的User表中有一个外键,Photo的Post表中也有一个外键。在这种情况下,似乎实现需要如此:
class User < ActiveRecord::Base
belongs_to :photo
end
class Photo < ActiveRecord::Base
has_one :user
has_one :post
end
class Post < ActiveRecord::Base
belongs_to: Photo
end
从语义上讲,这对我来说也没有多大意义。我再次出错了还是我在想这个?
答案 0 :(得分:1)
1)
#app/models/user.rb
class User < ActiveRecord::Base
has_one :photo
belongs_to :avatar, class_name: "Photo" #-> set this as the "avatar"
end
#app/models/photo.rb
class Photo < ActiveRecord::Base
belongs_to :user
end
user
可以制作照片;他可以定义他使用的avatar
:
@user = User.find x
@photo = @user.avatar
虽然我仍然觉得它看起来有点奇怪,但我认为它会起作用。
2)
#app/models/post.rb
class Post < ActiveRecord::Base
belongs_to :user
has_one :photo, as: :imageable
end
#app/models/user.rb
class User < ActiveRecord::Base
has_many :posts
has_one :photo, as: :imageable
belongs_to :avatar, class_name: "Photo"
end
#app/models/photo.rb
class Photo < ActiveRecord::Base
belongs_to :imageable, polymorphic: true #-> belongs to either post or user
end
在这两种情况下,我都会主张使用foreign_key
为用户定义avatar_id
。
这意味着belongs_to
关联(不理想),但意味着您可以上传任意数量的图片,引用其中一个作为头像。然后,您就可以根据个人资料中的要求调用avatar
方法。
执行此操作的最佳方法是使用join table
/ join model
,但这对您所要求的内容效率不高。