Active Record Rails中的查询不起作用

时间:2017-11-22 07:59:16

标签: ruby-on-rails ruby postgresql activerecord

我正在尝试使用Rails'活动记录生成before_save之类的东西并将其保存到字段中。它使用两个表(消息和规范)

我的models / message.rb文件如下所示:

class Message < ApplicationRecord
  has_many :specs
  accepts_nested_attributes_for :specs
  before_save :generate_output

  def generate_output
    self.output = "hola"
    specs_array = Spec.where(message_id: self.id).order('id asc')
    specs_array.each do |spec|
        self.output = "hello"
        if spec.call
          self.output += Message.find(name: spec).output
        else
          self.output += spec.specification
        end
      end
    self.output
  end
end

和我的models / spec.rb文件:

class Spec < ApplicationRecord
  belongs_to  :message
end

这是我的架构:

ActiveRecord::Schema.define(version: 20171121153642) do
  enable_extension "plpgsql"

  create_table "messages", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.text "output"
  end

  create_table "specs", force: :cascade do |t|
    t.string "specification"
    t.boolean "call"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "message_id"
    t.index ["message_id"], name: "index_specs_on_message_id"
  end

  add_foreign_key "specs", "messages"
end

我有一个消息表单,提交后会保存一个名称&#39;消息表和3规范(及其message_id)到Spec表。它还应该根据Message表中的规范生成并保存输出(如消息模型中所示)。

但是模型中的这两行代码不起作用:

    specs_array = Spec.where(message_id: self.id).order('id asc')
    specs_array.each do |spec|

我知道他们之前的工作正在发挥作用,因为当我创建新消息时,其输出会保存为&#39; hola&#39;如果这两行有效,它应该保存为&#39; hello&#39; +无论消息是什么。

我在rails控制台中尝试了这个查询,它完全正常,任何想法为什么它不能在应用程序中运行? 谢谢!

编辑: 我的控制器方法需要保存(它的Rails泛型方法):

  def create
    @message = Message.new(message_params)

    respond_to do |format|
      if @message.save
        format.html { redirect_to @message, notice: 'Message was successfully created.' }
        format.json { render :show, status: :created, location: @message }
      else
        format.html { render :new }
        format.json { render json: @message.errors, status: :unprocessable_entity }
      end
    end
  end

和messasge_params的私有方法:

def message_params
  params.require(:message).permit(:name, specs_attributes: [:id, :call, :specification])
end

1 个答案:

答案 0 :(得分:0)

尝试重写你的喜欢:

specs_array = Spec.where(message_id: self.id).order('id asc')

要:

specs_array = specs.order(:id)

写一条评论是否有帮助?