【问题标题】:Rails create and update array in databaseRails 在数据库中创建和更新数组
【发布时间】:2012-12-24 16:07:45
【问题描述】:

所以我有一个服务对象,可以将投票和投票的用户提交到数据库中:

这是帖子模型:

class Post < ActiveRecord::Base
  attr_accessible :comment_count, :downvote, :id, :text, :title, :upvote, :url, :user_id, :users_voted_up_by, :users_voted_down_by

  serialize :users_voted_up_by, Array
  serialize :users_voted_down_by, Array

  belongs_to :user
end

这是用户模型:

class User < ActiveRecord::Base
  attr_accessible :email, :password, :password_confirmation, :username, :good_karma, :bad_karma, :posts_voted_up_on, :posts_voted_down_on

  serialize :posts_voted_up_on, Array
  serialize :posts_voted_down_on, Array

  has_many :posts

  attr_accessor :password
  before_save :encrypt_password

  validates_confirmation_of :password
  validates_presence_of :password, :on => :create
  validates_presence_of :email
  validates_uniqueness_of :email
  validates_presence_of :username
  validates_uniqueness_of :username

  def self.authenticate(email, password)
    user = find_by_email(email)
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
      user
    else
      nil
    end
  end

  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end
end

现在这是我的 Voter 类,它控制赞成票和反对票。

class Voter
  def initialize(post, user)
    @post = post
    @user = user
  end

  def upvote
    return false unless @post.users_voted_up_by
    @post.upvote += 1
    @post.users_voted_up_by << @user.username
    @user.good_karma += 1
    @post.save && @user.save
  end

  def downvote
    return false unless @post.users_voted_down_by
    @post.upvote += 1
    @post.users_voted_down_by << @user.username
    @user.bad_karma += 1
    @post.save && @user.save
  end
end

它添加和恢复第一个罚款:

用户1

但是当我对另一个用户执行另一个“upvote”时,它没有将其添加到数组中,而是将其添加到字符串中,如下所示:

用户1用户2

我没有正确使用线路吗?

@post.users_voted_up_by &lt;&lt; @user.username

【问题讨论】:

  • 如果我们能看到这个实例中的模型关系会有所帮助
  • @freakyDaz 添加了它们。谢谢!
  • 你确定这不仅仅是to_s 方法。 @post.users_voted_up_by.join(', ') 产生了什么?
  • 未定义的方法“加入”。不只是.to_s,序列化将数组的完整性存储在数据库中,或者应该,我认为我没有正确使用它。我需要一个例子,但找不到。

标签: mysql ruby-on-rails ruby serialization


【解决方案1】:

您正在尝试通过序列化数组来建模多对多关系。在我看来,这是对 Rails 序列化功能的滥用。

设计问题的更合适的方法是创建一个属于 User 并有一个 Post 的 Vote 模型。从设计角度和数据库性能角度来看,它都更好。

这样做后,您不会将用户添加到帖子投票数组中,您只需使用投票者(用户)ID 和帖子 ID 创建一个新的 Vote 实例。

【讨论】:

  • 那张桌子不会很​​快变大吗?当您可以再拥有 3 个包含整数的列时,拥有第三个包含数千行的表。
  • 它会变得非常庞大,但由于今天的现代 SQL 引擎和正确列上的良好索引,该表上的查询将非常快。
  • 这个投票模型是否也需要一个控制器?
  • 不需要控制器。这将是一个更可靠的设计。
  • 我肯定会创建一个 VotesController 来处理所有投票操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
相关资源
最近更新 更多