4 find_or_create_by :레일 accepts_nested_attributes
class Foo < ActiveRecord::Base
belongs_to :bar
accepts_nested_attributes_for :bar
end
class Bar < ActiveRecord::Base
has_many :foo
end
바 '개체'를 포함하고 푸 '라벨'이 포함되어 있습니다.
나는 다음을 수행 할 수 있습니다 : 이것은 잘 작동
f=Foo.create(:label=>"label",:bar_attributes=>{:object=>"mason jar"})
.
그러나, 나는 할 원하는 것입니다 : 문제는
f=Foo.find_or_create_by(:label=>"label",:bar_attributes=>{:object=>"mason jar"})
, 이것은 SQL 오류
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: bar_attributes.object: SELECT "foo".* FROM "foo" WHERE "foo"."label" = ? AND "bar_attributes"."object" = 'mason jar' LIMIT 1
이런 일이 왜 이해할 수 실패,하지만 난 원하는 해당 기능을 사용할 수 있습니다. Bar에 대해 "find_or_create_by"작업을 수행하는 코드를 추가해야한다는 것을 알고 있지만, 이미이 작업을 수행하고 있으므로 여기에 넣지는 않을 것입니다. 현재 문제가 있습니다.
그래서 Foo의 'find'를 bar_attributes를 무시하고 필요한 경우에만 사용하는 방법이 있습니까?
아니면 다른 방법이 있습니까?
편집 :
우리는 두 개의 분리 된 개체가이 그것 인 방법입니다 이유를 설명. 막대는 독립 실행 형 개체입니다. Foo는 막대를 포함하는 별도의 객체 유형입니다.
Mason jar
Shovel
Can of corn
을 우리는 푸에 다른 기록을 할 수 : :
그래서 우리는 바에서 여러 기록을 가질 수
label: 123 => Bar: Shovel
label: 456 => Bar: Shovel
label: 123 => Bar: Can of corn
푸에 모든 바의 유효 바의,하지만 바의 라벨입니다 Foo에서는 Foo입니다.
f = Foo.find_or_create_by(:label=>'label',:bar_attributes=>{:object='object'})
를하고 필요한 경우 다음 막대를 만들 필요하면 푸를 만들 수 있습니다
그래서, 기본적으로, 나는 실행할 수 있어야합니다.
이 정보가 도움이되기를 바랍니다.
다음과 같이 find_or_create_by를 연결할 수 있습니다. 'find_or_create_by'를 사용하기 전에 where 절을 사용해 보셨습니까? –
글쎄, 일반적으로 중첩 된 속성은 한때 보석이었고 이후에 Rails에 통합되었으므로 ActiveRecord에 적용되는 모든 것이 중첩 된 속성과 함께 작동하지 않아도됩니다. 일부 속성을 가진 Bar 객체가 존재하지 않는 경우에만 Foo 객체를 만들려고합니까? –
위의 코드 중 일부는 아닙니다. 간단히 말해서, 내가하고 싶은 것은 bar에서 find_or_create_by를 실행 한 다음 Foo에서 find_or_create_by에 대한 결과를 사용하는 것입니다. –