Rails 3: Какие ассоциации я должен использовать для создания модельных отношений - PullRequest
2 голосов
/ 09 августа 2011

Я создаю приложение для загрузки и обмена файлами между пользователями. У меня есть модели 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

Существуют ли какие-либо рельсовые ассоциации, такие как 'полиморфные', которые я мог бы использовать для создания этих отношений?

Любые предложения приветствуются. Спасибо.

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Все, что вам нужно сделать, это прочитать Rails Guides и применить все, что вы узнали.

Как правило, вам необходимо хранить информацию о:

  • пользователе, который создал «общего доступа»
  • пользователя или группу или любого другого объекта, являющегося целью действия общего доступа
  • ресурс, который используется совместно

Итак:

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
0 голосов
/ 09 августа 2011

Я думаю, вы должны создать отношения примерно так:

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

.. это очень базовая модель отношений (это просто моя точка зрения :)).Пользователь может иметь много общих, а также принадлежащихВы можете установить идентификатор файла для таблицы UserSharing при создании пользователя и его общего ресурса.И затем вы можете создавать методы, перечисленные выше, как scopes в соответствующих моделях.Надеюсь, я немного тебе помог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...