我正在尝试使用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
答案 0 :(得分:0)
尝试重写你的喜欢:
specs_array = Spec.where(message_id: self.id).order('id asc')
要:
specs_array = specs.order(:id)
写一条评论是否有帮助?