0

したがって、投票と投票されたユーザーをデータベースに送信するサービス オブジェクトがあります。

投稿モデルは次のとおりです。

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 << @user.username

4

1 に答える 1

1

シリアル化された配列を介して多対多の関係をモデル化しようとしています。私の意見では、これはRailsのシリアル化機能の誤用です。

問題を設計するためのより適切な方法は、ユーザーに属し、投稿が1つある投票モデルを作成することです。設計の観点とdb-パフォーマンスの観点の両方で優れています。

これを行うと、投票後の配列にユーザーを追加せずに、投票者(ユーザー)IDと投稿IDを使用して新しいVoteインスタンスを作成するだけです。

于 2013-01-10T10:37:11.533 に答える