Моделирование рельсов для пользователя - PullRequest
0 голосов
/ 20 мая 2010

При создании приложения rails, которое позволяет пользователю входить в систему и создавать данные, лучше ли устанавливать ассоциацию belongs_to :user для каждой отдельной модели? Например, скажем, пользователь может создавать избранное, цвета и теги.

И скажем, Избранное has_many :tags и Цвета также has_many :tags. Для тегов все еще важно belong_to :user при условии, что пользователь является единственным лицом, уполномоченным редактировать эти теги?

И аналогичный вопрос в том же духе: обновляя данные в FavoritesController, я пришел к выводу, что вы выполняете операции CRUD, всегда выполняя что-то вроде current_user.favorites.find(param[:id].update_attributes(param[:favorite]), чтобы они могли определенно обновлять только принадлежащие модели им. Правильно?

Обновление Не слишком обрадовался ни один из ответов, поскольку никто не ответил на мой вопрос, а вместо этого выбрал модель «Только для примера» с тегами, предлагающую лучшие способы сделать это. Я предполагаю, что я был прав, и модели должны принадлежать: пользователю. Я также обнаружил несколько хороших советов по безопасности, которые касаются моих вопросов здесь: http://asciicasts.com/episodes/178-seven-security-tips

Ответы [ 4 ]

1 голос
/ 20 мая 2010

Когда вы описываете теги, кажется, что они являются скорее аспектом, поэтому вы можете реализовать их как полиморфную ассоциацию. Но вы должны делать это много-много, так как теги могут многократно использоваться среди пользователей и тегируемых объектов. Давайте назовем модель объединения Tagging, которая будет принадлежать пользователю, если вы хотите вспомнить, кто создал тегирование.

class Tag < ActiveRecord::Base
  has_many :taggings, :dependent => :destroy
  has_many :colors, :through => :taggings, :source => :taggable, :source_type => "Color"
  has_many :favorites, :through => :taggings, :source => :taggable, :source_type => "Favorite"
end

class Tagging < ActiveRecord::Base
  belongs_to :user
  belongs_to :taggable, :polymorphic => true
  belongs_to :tag  
end

class Color < ActiveRecord::Base
  belongs_to :user
  has_many :taggings, :as => :taggable
  has_many :tags, :through => :taggings
end

class Favorite < ActiveRecord::Base
  belongs_to :user
  has_many :taggings, :as => :taggable
  has_many :tags, :through => :taggings
end

class User < ActiveRecord::Base
  has_many :favorites
  has_many :colors
  has_many :taggings
  has_many :tags, :through => :taggings
end

Что касается обновления Favorite, я согласен с вами: вы в основном будете работать в рамках пользователя (скорее всего, текущего пользователя).

0 голосов
/ 20 мая 2010

: has_many и: assign_to в AR объяснят взаимосвязь между моделями, но не обязательно использовать их в своих моделях, связь между ними уже будет присутствовать в таблицах как внешний ключ.

Но добавление: has_many или: own_to к вашим моделям даст вам дополнительные методы для вашей модели

например:

<code>
class User < ActiveRecord::Base
 has_many :favorites</p>

<p>#def favorites
 #  Favorite.find_all_by_user_id(self.id)
 # end
end

Если вы упомянете has_many, это даст новый метод в вашей модели, называемый избранное, этот метод будет невидимым (будет присутствовать в AR).

Аналогично для любой ассоциации, если вы планируете использовать методы такого рода, вам следует использовать ассоциации в своих моделях.

0 голосов
/ 20 мая 2010

Предлагаемый механизм звучит для меня слишком сложно. Я предпочитаю способ current_user. Предположим, что в вашей системе аутентификации есть current_user (по аутентичному пути), затем просто добавьте пользователя references (user_id) в каждую соответствующую таблицу. Обновите current_user для новой или обновите запись через контроллер filter.

В моделях укажите соответствующее значение belongs_to :users, в случае необходимости укажите has_many в модели пользователя.

0 голосов
/ 20 мая 2010

Это зависит от вашей модели. Оба случая действительны, но я бы не рекомендовал делать такие круглые отношения. Наличие иерархии является более гибким. Например: Пользователь-> Избранное-> Теги (если вы не хотите также отмечать пользователей)

User.favorites.find(params[:id]).update_attributes(param[:favorite])

это то, что вы имеете в виду, я думаю (синтаксис). Тот, кто вызывает URL, выполнит это действие. Не полагайтесь на тот факт, что этот URL виден только одному пользователю (владельцу избранного). У вас должны быть на месте проверки того, что зарегистрированный в данный момент пользователь - единственный, кто выполняет действия над объектами, которые ему принадлежат.

...