2013-06-30 3 views
0

레일스에서 ​​이상한 문제가 있습니다. Rails에서 모델의 필드 값을 설정하고 싶지만 레일 콘솔에서조차 할 수 없습니다. 내가 Time.now 마지막 캠페인의 approved_at 속성의 값을 설정하려고레일에서 모델의 값 설정

1.9.3p393 :008 > campy = Campaign.last 
    Campaign Load (0.8ms) SELECT `campaigns`.* FROM `campaigns` ORDER BY `campaigns`.`id` DESC LIMIT 1 
=> #<Campaign id: 3, name: "Stuff", ..., approved_at: nil, approval_requested_at: nil> 
1.9.3p393 :009 > campy.approved_at = Time.now 
=> 2013-07-01 00:54:38 +0200 
1.9.3p393 :010 > campy.save 
    (0.2ms) BEGIN 
    (0.2ms) COMMIT 
=> true 
1.9.3p393 :011 > campy.approved_at 
=> 2013-07-01 00:54:38 +0200 
1.9.3p393 :012 > Campaign.last.approved_at 
    Campaign Load (0.7ms) SELECT `campaigns`.* FROM `campaigns` ORDER BY `campaigns`.`id` DESC LIMIT 1 
=> nil 
1.9.3p393 :013 > campy = Campaign.last 
    Campaign Load (0.6ms) SELECT `campaigns`.* FROM `campaigns` ORDER BY `campaigns`.`id` DESC LIMIT 1 
=> #<Campaign id: 3, name: "Stuff", ..., approved_at: nil, approval_requested_at: nil> 
1.9.3p393 :014 > campy.approved_at = Time.now 
=> 2013-07-01 00:55:11 +0200 
1.9.3p393 :015 > campy.save 
    (0.3ms) BEGIN 
    (0.2ms) COMMIT 
=> true 
1.9.3p393 :016 > Campaign.last.approved_at 
    Campaign Load (0.7ms) SELECT `campaigns`.* FROM `campaigns` ORDER BY `campaigns`.`id` DESC LIMIT 1 
=> nil 

하지만 내가 저장 한 후에도 전무 남아 : 관찰한다. approved_at는 캠페인 모델의 상단에있는 attr_accessor 함수를 통해 사용할 수 있습니다. 이 속성의 값을 변경할 수없는 이유는 무엇입니까?

편집 :

문제의 또 다른 흥미로운 측면은 내가 campy.approved_at를 설정하고 명시 적으로 값을 볼 때, 나는 정확한 값을 얻을 수 있다는 것입니다. 내가 변수로 따분 볼 때, 레일은 여전히 ​​attr_accessor와 가상 속성으로 approved_at를 만들었습니다 때문입니다 전무

1.9.3p393 :027 > campy.approved_at = Time.now 
=> 2013-07-01 01:19:05 +0200 
1.9.3p393 :028 > campy.save 
    (0.2ms) BEGIN 
    (0.2ms) COMMIT 
=> true 
1.9.3p393 :029 > campy.approved_at 
=> 2013-07-01 01:19:05 +0200 
1.9.3p393 :030 > campy 
=> #<Campaign id: 3, name: "Stuff", ... , approved_at: nil, approval_requested_at: nil> 
+0

무엇에 대해'campy.update_attribute : approved_at, Time.now'? –

+0

'id'를 확인하여 매번 같은 레코드를 얻었음을 확인할 수 있습니까? –

+0

Campaign idd는 campy와 Campaign.last 모두 3입니다. update 속성을 사용하면 approved_at도 설정되지 않습니다. –

답변

2

로 값을 보여줍니다. attr_accessorattr_accessible으로 읽는 것이 좋지만이 경우에는 둘 다 필요하지 않습니다.

가상 속성으로 지정하면 데이터베이스에 유지되지 않습니다. attr_accessor 행을 삭제하면 문제가 없습니다.

는 설명 :

attr_accessor은 그 모델에 메모리 속성에 대한 setter 메소드를 터링 만듭니다. 기본 데이터베이스 속성에 대해 ActiveRecord에 의해 자동으로 생성되는 getter 및 setter 메소드보다 우선 순위가 높습니다. 을 호출 할 때 AR은 approved_at을 업데이트 한 것으로 생각하지 않습니다. 실제로 업데이트하지 않았기 때문에 업데이트했습니다. 가상 속성 만

attr_accessible은 속성 해시 값의 일부로 값을 create 또는 new으로 전달하는 경우와 같이 특정 속성의 대량 할당을 허용하는 데 사용됩니다.

+0

정확함, thanks –

+0

그러나 rspec에서 campaign.approved_at를 확인하면 오류가 발생합니다. NoMethodError : 정의되지 않은 메소드 'approved_at'. attr_accessible이 필요 없다고 확신합니까? –

+0

그래, attr_accessor가 AR 속성을 덮어 쓰지 않을지 모르겠다. 당신이 데이터베이스이고'schema.rb'이 그 속성을 포함하고 있는지 확인하십시오, 당신은 이전 등을 놓친 것 같습니다. –

관련 문제