it-source

저장하지 않고 Rails update_attributes?

criticalcode 2023. 5. 31. 16:02
반응형

저장하지 않고 Rails update_attributes?

에 대한 대안이 있습니까?update_attributes그것이 기록을 저장하지 않습니까?

그래서 저는 다음과 같은 것을 할 수 있었습니다.

@car = Car.new(:make => 'GMC')
#other processing
@car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it")
#other processing
@car.save

BTW, 나는 내가 할 수 있다는 것을 압니다.@car.model = 'Sierra'하지만 한 줄로 모두 업데이트하고 싶습니다.

당신이 찾고 있는 것은.

기본적으로 update_attributes와 동일하지만 레코드를 저장하지는 않습니다.

class User < ActiveRecord::Base
  attr_accessible :name
  attr_accessible :name, :is_admin, :as => :admin
end

user = User.new
user.assign_attributes({ :name => 'Josh', :is_admin => true }) # Raises an ActiveModel::MassAssignmentSecurity::Error
user.assign_attributes({ :name => 'Bob'})
user.name        # => "Bob"
user.is_admin?   # => false
user.new_record? # => true

사용할 수 있습니다.assign_attributes또는attributes=(똑같습니다)

메서드 치트 시트 업데이트(레일 6용):

  • update=assign_attributes+save
  • attributes=의 가명.assign_attributes
  • update_attributes사용되지 않음, 별칭update

출처:
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_assignment.rb

또 다른 커닝 시트:
http://www.davidverhasselt.com/set-attributes-in-activerecord/ #편집 시트

'속성' 방법을 사용할 수 있습니다.

@car.attributes = {:model => 'Sierra', :years => '1990', :looks => 'Sexy'}

출처: http://api.rubyonrails.org/classes/ActiveRecord/Base.html

attributes=(new_attributes, guard_protected_attributes = true) 특성 이름과 일치하는 키를 가진 해시를 전달하여 모든 특성을 한 번에 설정할 수 있습니다(열 이름과 다시 일치함).

guard_protected_attributes가 true(기본값)이면 attr_protected 매크로를 사용하여 이러한 대량 할당 형식으로부터 중요한 속성을 보호할 수 있습니다.또는 attr_accessible 매크로로 액세스할 수 있는 속성을 지정할 수 있습니다.그러면 해당 속성에 포함되지 않은 모든 속성을 대량 할당할 수 없습니다.

class User < ActiveRecord::Base
  attr_protected :is_admin
end

user = User.new
user.attributes = { :username => 'Phusion', :is_admin => true }
user.username   # => "Phusion"
user.is_admin?  # => false

user.send(:attributes=, { :username => 'Phusion', :is_admin => true }, false)
user.is_admin?  # => true

저장하지 않고 ActiveRecord 모델에 값을 대량 할당하려면 다음 중 하나를 사용합니다.assign_attributes또는attributes=방법들.이러한 방법은 레일 3 이상에서 사용할 수 있습니다.그러나 약간의 차이가 있으며 버전과 관련하여 주의해야 합니다.

두 가지 방법 모두 다음과 같은 사용법을 따릅니다.

@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }

@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }

어느 방법도 유효성 검사를 수행하거나 콜백을 실행하지 않습니다. 콜백과 유효성 검사는 다음과 같은 경우에 발생합니다.save이 호출됩니다.

레일 3

attributes=와 약간 다릅니다.assign_attributes3번 레일에서. attributes=전달된 인수가 해시인지 확인하고 그렇지 않은 경우 즉시 반환합니다.assign_attributes이러한 해시 검사가 없습니다.의 ActiveRecord 특성 할당 API 설명서를 참조하십시오.

다음과 같은 잘못된 코드는 속성을 설정하지 않고 단순히 반환하면 자동으로 실패합니다.

@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]

attributes=할당이 성공적으로 수행된 것처럼 조용히 행동합니다. 실제로는 그렇지 않습니다.

이 잘못된 코드는 다음과 같은 경우 예외를 발생시킵니다.assign_attributes는) 의 해시 키를 문자열화하려고 .

@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])

assign_attributesa를 올릴 것입니다.NoMethodError대 외 한 외 예 ▁for ▁exception에stringify_keys첫 번째 인수가 해시가 아님을 나타냅니다.예외 자체는 실제 원인에 대해 그다지 유용하지 않지만 예외가 발생한다는 사실은 매우 중요합니다.

이러한 경우의 유일한 차이점은 대량 할당에 사용되는 방법입니다.attributes=하고, 묵히성고하공묵,고,,assign_attributes예외를 발생시켜 오류가 발생했음을 알립니다.

이러한 처럼 보일 의 데이터 하여 에예한조것으로 잊어버릴 때에도 이러한 할 수 .Hash[] .map위의 코드 50줄과 속성 할당에서 제거된 3개의 함수를 유지하면 실패할 수 있습니다.

레일 3의 교훈은 다음과 같습니다: 항상 사용assign_attributesattributes=.

레일 4

4, 레에 4서일에서,attributes= 에대별 뿐다입니일칭의 입니다.assign_attributes의 ActiveRecord 특성 할당 API 설명서를 참조하십시오.

레일 4에서는 두 가지 방법 중 하나를 번갈아 사용할 수 있습니다.예외가 합니다.ArgumentError: When assigning attributes, you must pass a hash as an argument.

검증

만약 당신이 사전 비행 임무를 준비하고 있다면.save저장하기 전에 확인할 수도 있습니다.당신은 할 수 .valid?그리고.invalid?이를 위한 방법.둘 다 부울 값을 반환합니다. valid?저장되지 않은 모델이 모든 유효성 검사를 통과하면 true를 반환하고 그렇지 않으면 false를 반환합니다. invalid? 의역 됩니다의 입니다.valid?

valid?다음과 같이 사용할 수 있습니다.

@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?

전화를 걸기 검사 할 수 .save.

언급URL : https://stackoverflow.com/questions/6770350/rails-update-attributes-without-save

반응형