关于Rails关联的问题。
请考虑以下模型:
人和事件可以有很多图像 上传到活动的图片需要能够与多个人相关联。
这意味着人和图像之间存在两种关系。
将图像直接上传到此人的图像。还有一个人在活动中被贴上标签。
人与事件之间是否存在关系,这是基于他们在事件中的一个(或多个)图像中被标记的事实?在这方面,它是一种图像标记系统,其中基于人们被标记的事件来创建关联。
想知道Rails创建此关联的最佳做法是什么?非常感谢任何帮助或建议!
答案 0 :(得分:2)
我对最佳做法并不十分肯定, 但据我所知,有机会以简单的方式解决你的案子:
我们有:
Event ... has_many :photos; Photo ... belongs_to :event
并且解决方案是创建一些中间ActiveRecord类
People ... has_many :photos, :through photo_mappings
PhotoMapping ... belongs_to :user; belongs_to :photo
有一个很好的AR协会最佳实践1
答案 1 :(得分:1)
在rails中,绝对可以定义具有额外字段的连接表。所以在这种情况下我会定义下表:
class LinkedImage
belongs_to :person
belongs_to :image
OWNER=1
TAGGED=2
validates :relation_type, :inclusion => {:in => [OWNER, TAGGED]}
end
此表会将图像链接到某个人,并且有一个额外的字段relation_type
(您可能会想到一个更合适的名称),现在可以有两个值:1(对于{{1} },意思是图像直接上传到人),2(该人在图像中被标记)。除了这种关系,也许你想要存储额外的东西,比如图像中的位置,额外的评论,然后你也可以在这里轻松添加。
这个人看起来像是:
OWNER
并且class Person
has_many :linked_images
has_many :uploaded_images, :class_name => Image,
:through => :linked_images,
:conditions => "relation_type=#{LinkedImage::OWNER}"
has_many :tagged_in_images, :class_name => Image,
:through => :linked_images,
:conditions => 'relation_type=#{LinkedImage::TAGGED}"
end
的代码可能类似。
我希望这会有所帮助。
答案 2 :(得分:-1)
我不知道这是不是最好的方法,但我会这样做:
class User < ActiveRecord::Base
has_many :images, :as => :owner
has_many :tags
has_many :tagged_images, :through => :tags, :source => :image
has_many :tagged_events, :finder_sql => %q( SELECT `events`.* FROM `events`, `images` WHERE `events`.id = `images`.owner_id AND `images.owner_type ="Event" `
WHERE (`images`.id IN (#{tagged_image_ids.join(',')}) ))
end
class Event < ActiveRecord::Base
has_many :images, :as => :owner
has_many :tagged_users, :finder_sql => %q( SELECT `users`.* FROM `users`, `images` WHERE `users`.id = `images`.owner_id AND `images.owner_type ="User" `
WHERE (`images`.id IN (#{image_ids.join(',')}) ))
end
class Tag < ActiveRecord::Base
belongs_to :user
belongs_to :image
end
class Image < ActiveRecord::Base
belongs_to :owner, :polymorphic => true
has_many :tags
has_many :tagged_users, :through => :tags, :source => :user
end
注意:使用finder_sql并不是Rails中最好的,因为例如它不允许您仅使用关系添加新的标记图像,但它可以正常阅读。