2017-09-06 80 views
0

我试图用find_or_initialize_by但是它不分配属性,因为它应该做的。我有以下几点:红宝石 - find_or_intialize_by未分配的属性

vote_id = 1534 
vote = record.answer_records.find_or_initialize_by(stage_answer_id: vote_id) 

当我进入binding.pry我可以看到以下:

vote 
=> #<AnswerRecord id: 3926, stage_record_id: 2210, stage_answer_id: nil, value: "{:stage_answer_id=>1563}", correct: false, created_at: "2017-09-06 11:33:49", updated_at: "2017-09-06 11:33:49", deleted_at: nil> 

出于某种原因,它被分配

value: "{:stage_answer_id=>1563}" 

而非

stage_answer_id: 1563 

我在做什么错?在此先感谢

编辑:answer_record.rb

class AnswerRecord < ActiveRecord::Base 

    acts_as_paranoid 

    belongs_to :stage_record 
    belongs_to :stage_answer 
    has_one :activity_feedback 

    def self.for_answer(answer) 
    find_by(stage_answer: answer) 
    end 

    def wrong? 
    !correct 
    end 
end 

第二个编辑: 从byebug更多:

>> opinion 
=> #<AnswerRecord id: nil, stage_record_id: nil, stage_answer_id: 1692, value: "This is my answer", correct: true, created_at: nil, updated_at: nil, deleted_at: nil> 
>> opinion.save 
!! #<ActiveRecord::StatementInvalid: PG::NotNullViolation: ERROR: null value in column "value" violates not-null constraint 
DETAIL: Failing row contains (3938, 2222, 1692, null, f, 2017-09-06 12:03:09.851213, 2017-09-06 12:03:09.851213, null). 
: INSERT INTO "answer_records" ("stage_answer_id", "stage_record_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"> 

由于日志显示PSQL试图更新其他属性,而不是“值'属性,并且我没有任何启动器设置..

第三编辑:

show-method record.answer_records.find_or_initialize_by 

返回以下

From: /Users/mark/.rvm/gems/ruby-2.3.2/gems/activerecord-4.2.7.1/lib/active_record/relation.rb @ line 223: 
13:15:53 web.1 | Owner: ActiveRecord::Relation 
13:15:53 web.1 | Visibility: public 
13:15:53 web.1 | Number of lines: 3 
13:15:53 web.1 | 
13:15:53 web.1 | def find_or_initialize_by(attributes, &block) 
13:15:53 web.1 | find_by(attributes) || new(attributes, &block) 
13:15:53 web.1 | end 
+0

你是否重写了'initialize'方法?这不是正常的行为。 –

+0

不是我的知识.. – Mark

+2

等等,等等,我只是注意到了一些东西。在你的帖子的顶部,你写道:'AnswerRecord id:3926' - 记录**已经存在**!你有**找到它;没有初始化它。 (所以'价值'是*没有被分配*它已经在那里。)这就是造成混乱的原因。 –

回答

1

你必须了解如何find_or_initialize_by工作,寻找对代码show-method,你必须看到它的:

def find_or_initialize_by(attributes, &block) 
    find_by(attributes) || new(attributes, &block) 
end 

所以你的情况是这样的:

record.answer_records.find_by(stage_answer_id: vote_id) || 
record.answer_records.new(stage_answer_id: vote_id) 

我假设t你认为你正在呼叫新的,但可能你已经有匹配stage_product_idstage_answer_id的记录,所以.new永远不会被调用。可能那个记录有令人困惑的value文本字段。

你可以叫.persisted?方法,以验证是否记录是新的或从数据库,检查数据库日志在控制台:

vote_id = 1534 
vote = record.answer_records.find_or_initialize_by(stage_answer_id: vote_id) 
puts vote.persisted? 

它值得一提的是,@汤姆 - 主在comments一个想出了答案我之前的一些时刻

+0

为什么你不只是编辑你的答案?这没有提供一个替代解决方案的原始答案,因为既不其中一人真的“回答”了这个问题,而只是指出了潜在的问题。 – engineersmnky

+0

我想删除第一个答案,因为它不回答确切的问题,并有太多的噪音 –

+0

如果你认为是真的,然后删除它,否则这两个答案的组合“在我看来创造太多的噪音” – engineersmnky