在Rails中将数组字段添加到用户数据库

时间:2015-04-23 21:33:15

标签: ruby-on-rails ruby

我有一个应用程序,其中有一个搜索框,您可以在其中输入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中的事件。任何资源链接都将非常感激。

1 个答案:

答案 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_idpic_id上有一个复合索引,约束UNIQUE,因此人们不能两次收藏。

使用数组类型的列,尤其是,当数据库本身不支持它们时,变得非常昂贵且难以使用。操作它们需要重写整个用户记录,以便人们更喜欢更多图像,更新的成本会增加。同样地,找到所有喜欢图像的用户在计算上反转成本很高。

如果您正在使用RDBMS,那么使用传统表格构建它通常是最好的计划。