Rails 3:我应该使用什么关联来创建模型关系

时间:2011-08-09 14:15:12

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

我正在创建一个用于在用户之间上传和共享文件的应用。 我有User和Files模型并创建了第三个File_Sharing_Relationships模型,其中包含sharer_id,file_id和shared_with_id列。我希望能够创建以下方法:

     @upload.file_sharing_relationships - lists users that the file is shared with
     @user.files_shared_with -  lists files that are shared with the user.
     @user.files_shared - lists files that the user is sharing with others
     @user.share_file_with - creates a sharing relationship

是否存在任何rails关联,例如我可以使用'polymorphic'来建立这些关系?

任何建议表示赞赏。感谢。

2 个答案:

答案 0 :(得分:1)

您需要做的就是阅读Rails指南并应用您学到的所有知识。

基本上您需要存储以下信息:

  • 创建“分享”的用户
  • 用户或群组或任何共享操作的目标
  • 正在共享的资源

所以:

class SharedItem < ActiveRecord::Base
      belongs_to :sharable, :polymorphic => true #this is user, please think of better name than "sharable"...
      belongs_to :resource, :polymorphic => true #can be your file
      belongs_to :user
end

您需要SharedItem:

user_id: integer, sharable_id: integer, sharable_type: string, resource_id: integer, resource_type: string

然后你可以通过编写命名范围来获得你指定的“方法”,如:

named_scope :for_user, lambda {|user| {:conditions => {:user_id => user.id} }}

或指定适当的关联:

class File < ActiveRecord::Base
  has_many :shared_items, :as => :resource, :dependent => :destroy
end

答案 1 :(得分:0)

我认为你应该建立这样的关系:

class User
  has_many :files
  has_many :user_sharings
  has_many :sharings, :through => :user_sharings
end

class File
  belongs_to :user
end

class Sharing
  has_many :user_sharings
  has_many :users, :through => :user_sharings
end

class UserSharing
  belongs_to :user
  belongs_to :sharing
end

..这是非常基本的关系模型(这只是我的观点:))。用户可以拥有许多sharings,也属于sharings。创建用户及其共享时,可以将文件ID设置为UserSharing表。然后,您可以在适当的模型中创建上面列出的方法scopes。我希望我帮助你一点。