2015-04-23 3 views
0

У меня есть приложение, в котором есть окно поиска, в котором вы вводите имя пользователя Twitter, и оно возвращает недавние упоминания этого пользователя. https://hurrier-app.herokuapp.com/Добавить поле массива в пользовательскую базу данных в Rails

Некоторые твиты имеют изображение, связанное с ними. Мне нужно иметь возможность «любимого» изображения, а затем иметь возможность просматривать их все на отдельной странице.

Я очень новичок в Rails, поэтому я думал о добавлении массива fav_pics к пользовательской модели и добавлении к ней URL-адреса каждой фотографии при его использовании. Не уверен, где начать.

вот мой user.rb

class User < ActiveRecord::Base 
    def self.from_omniauth(auth) 
    user = where(provider: auth.provider, uid: auth.uid).first || create_from_omniauth(auth) 
    user.oauth_token = auth["credentials"]["token"] 
    user.oauth_secret = auth["credentials"]["secret"] 
    user.save! 
    user 
    end 

    def self.create_from_omniauth(auth) 
    create! do |user| 
     user.provider = auth["provider"] 
     user.uid = auth["uid"] 
     user.name = auth["info"]["nickname"] 
    end 
    end 

    def twitter 
    if provider == "twitter" 
     @twitter ||= Twitter::Client.new(oauth_token: oauth_token, oauth_token_secret: oauth_secret) 
    end 
    end 

    has_many :fav_pics 
    has_many :pics_favorited, 
    class_name: 'Pic', 
    through: :fav_pics 

end 

class FavPic < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :pic 
end 

class Pic < ActiveRecord::Base 
    has_many :fav_pics 
    has_many :fav_users, 
    class_name: 'User', 
    through: :fav_pics 
end 

теперь, как я на самом деле справиться с "любимой" событие? У меня есть опыт работы с Meteor (javascript), но я не уверен, как обрабатывать события в Rails. Любые ссылки на ресурсы будут высоко оценены.

ответ

4

Это правильная идея. То, что вы описываете, - это отношение соединения, где к моделям относится одна треть, которая их объединяет.

Например:

class User 
    has_many :fav_pics 
    has_many :pics_favorited, 
    class_name: 'Pic', 
    through: :fav_pics 
end 

class FavPic 
    belongs_to :user 
    belongs_to :pic 
end 

class Pic 
    has_many :fav_pics 
    has_many :fav_users, 
    class_name: 'User', 
    through: :fav_pics 
end 

Это обычно ключ здесь. Обычно средняя таблица имеет составной индекс на user_id и pic_id с ограничением UNIQUE, поэтому люди не могут любить дважды.

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

Если вы используете СУРБД, то структурирование ее с использованием обычных таблиц обычно является лучшим планом.

Смежные вопросы