在ruby中将数据添加到数据库

时间:2014-12-23 12:12:18

标签: ruby-on-rails ruby sqlite

我很挑剔,我认为我超越了目前的红宝石知识,但我不想放弃。   我目前有一个可以发布的高音扬声器,人们可以通过https://www.railstutorial.org/book/关注其他人。我想在本教程的tweeter中添加主题标签。为了做到这一点,我创建了2个表,因为tweet和hashtag是多对多的关系。表格是:

  class CreateHashrelations < ActiveRecord::Migration
  def change
    create_table :hashrelations do |t|
      t.integer :tweet_id
      t.integer :hashtag_id

      t.timestamps null: false
    end
    add_index :hashrelations, [:tweet_id, :hashtag_id], unique: true
  end
end

这是保存推文和主题标签键所需的额外表格。另一个表是hashtag表,其中我有hastag的id和名称

class CreateHashtags < ActiveRecord::Migration
  def change
    create_table :hashtags do |t|
      t.string :name

      t.timestamps null: false
    end
  end
end

在模型中我放了以下的relathipips:

class Hashtag < ActiveRecord::Base
    has_many :hashtagrelations, dependent: :destroy
    has_many :tweets, through: :hashtagrelations
    validates :name, presence: true
end

class Hashrelation < ActiveRecord::Base
    belongs_to :tweet
    belongs_to :hashtag
    validates :tweet_id, presence: true
    validates :hashtag_id, presence: true
end

class Tweet < ActiveRecord::Base
.....
  has_many :hashtagrelations, dependent: :destroy
  has_many :hashtags, through: :hashtagrelations
....

end

当提交推文时,我保存它,如果它被保存,我想看看它是否有主题标签,如果有,我想在Hashtagrelations和Hashtags表中添加必要的数据。 我试着这样做:

class TweetsController < ApplicationController
......


  def create
    @tweet = current_user.tweets.build(tweet_params)
    if @tweet.save
      add_hashtags(@tweet)
      flash[:success] = "Tweet created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'
    end
  end

......

  private

........

    def add_hashtags(tweet)
      tweet.content.scan(/(?:\s|^)(?:#(?!(?:\d+|\w+?_|_\w+?)(?:\s|$)))(\w+)(?=\s|$)/){ |tag|
        newhash[:new] = tag
        @hashtag = Hashtag.new(new_hash[:new])
        @hashtag.save
        data[:new] = [tweet.id,@hashtag.id]
        @hashrel = Hashtagrel.new(data[:new])
        @hashrel.save
      }
    end

end

这不是正确的方法。我试图添加newhash和数据,因为如果我只在那里做标记我会得到

When assigning attributes, you must pass a hash as an argument.

我意识到这是一个愚蠢的问题,但我没有找到教程,教我如何将这些数据添加到我的表中。我很感激你的帮助

1 个答案:

答案 0 :(得分:1)

这是一组值:

data[:new] = [tweet.id,@hashtag.id]

在将内容移入另一个变量(或数据结构)之前,请先尝试显式。

@hashrel = Hashtagrelation.new(tweet_id: tweet.id, hashtag_id: @hashtag.id)

其余的代码看起来不错,我想你已经得到了它。