我有一个应用程序,其中有一个搜索框,您可以在其中输入Twitter用户名,并返回该用户最近的提及。 https://hurrier-app.herokuapp.com/
有些推文有与之相关的图片。我需要能够"最喜欢"一个图像,然后能够在一个单独的页面上查看所有这些。
我对Rails很陌生,所以我想在用户模型中添加一个数组fav_pics
,并在喜欢它时将每张照片的网址附加到它上面。不知道从哪里开始。
这是我的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
现在我如何实际处理&#34;最喜欢的&#34;事件?我有使用Meteor(javascript)的经验,但我不知道如何处理Rails中的事件。任何资源链接都将非常感激。
答案 0 :(得分: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
,因此人们不能两次收藏。
使用数组类型的列,尤其是,当数据库本身不支持它们时,变得非常昂贵且难以使用。操作它们需要重写整个用户记录,以便人们更喜欢更多图像,更新的成本会增加。同样地,找到所有喜欢图像的用户在计算上反转成本很高。
如果您正在使用RDBMS,那么使用传统表格构建它通常是最好的计划。