Rails Association术语:Belongs_to和has_many

时间:2016-02-02 18:12:07

标签: ruby-on-rails database activerecord associations

我有两个关于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

从语义上讲,这对我来说也没有多大意义。我再次出错了还是我在想这个?

1 个答案:

答案 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)

polymorphic

#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,但这对您所要求的内容效率不高。