Rails协会 - 最佳实践的想法

时间:2011-08-29 11:08:18

标签: ruby-on-rails ruby-on-rails-3 activerecord

关于Rails关联的问题。
请考虑以下模型:


  • 活动
  • 图片

人和事件可以有很多图像 上传到活动的图片需要能够与多个人相关联。

这意味着图像之间存在两种关系。
将图像直接上传到此人的图像。还有一个人在活动中被贴上标签。

事件之间是否存在关系,这是基于他们在事件中的一个(或多个)图像中被标记的事实?在这方面,它是一种图像标记系统,其中基于人们被标记的事件来创建关联。

想知道Rails创建此关联的最佳做法是什么?非常感谢任何帮助或建议!

3 个答案:

答案 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中最好的,因为例如它不允许您仅使用关系添加新的标记图像,但它可以正常阅读。