【问题标题】:Rails associations - ideas for best practiceRails 协会 - 最佳实践的想法
【发布时间】:2011-08-31 04:00:09
【问题描述】:

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


  • 活动
  • 图片

人物和事件可以有很多图像。
上传到事件的图片,需要有关联多人的能力。

这意味着 peopleimages 之间存在两种关系。
一种图像直接上传到人的地方。还有一个人在事件中被标记。

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

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

【问题讨论】:

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


    【解决方案1】:

    我不确定最佳实践, 但据我了解,有机会以简单的方式解决您的问题:

    我们有:

    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

    【讨论】:

    • 但是这样做你假设每张照片都上传到一个活动中。如果我理解好的@galaxy 也在要求用户照片。
    • 我们只能猜测,反正最后一个字在 Galaxy 下!
    • @cicloon 是正确的。照片上传到人物和事件,并在事件中标记。
    【解决方案2】:

    在 Rails 中,绝对可以定义一个包含额外字段的连接表。所以在这种情况下,我将定义下表:

    class LinkedImage
      belongs_to :person
      belongs_to :image
    
      OWNER=1
      TAGGED=2
    
      validates :relation_type, :inclusion => {:in => [OWNER, TAGGED]}
    end
    

    此表将图像链接到一个人,并有一个额外的字段relation_type(您可能会想到一个更合适的名称),它现在可以有两个值:1(对于OWNER,表示图像直接上传给该人)和2(该人在图像中被标记)。除了关系之外,也许你想存储一些额外的东西,比如图像中的位置、额外的评论,那么你也可以很容易地在此处添加。

    这个人看起来像:

    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 
    

    Image 的代码可能类似。

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      我不知道这是否是最好的方法,但我会这样做:

      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
      

      注意:在 Rails 中使用 finder_sql 并不是最好的,因为例如它不允许您仅使用关系添加新的标记图像,但它可以很好地阅读。

      【讨论】:

        猜你喜欢
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多