2016-06-21 5 views
2
나는 다음과 같은 모델을 가지고

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'}) 

를하고 필요한 경우 다음 막대를 만들 필요하면 푸를 만들 수 있습니다

그래서, 기본적으로, 나는 실행할 수 있어야합니다.

이 정보가 도움이되기를 바랍니다.

+0

다음과 같이 find_or_create_by를 연결할 수 있습니다. 'find_or_create_by'를 사용하기 전에 where 절을 사용해 보셨습니까? –

+0

글쎄, 일반적으로 중첩 된 속성은 한때 보석이었고 이후에 Rails에 통합되었으므로 ActiveRecord에 적용되는 모든 것이 중첩 된 속성과 함께 작동하지 않아도됩니다. 일부 속성을 가진 Bar 객체가 존재하지 않는 경우에만 Foo 객체를 만들려고합니까? –

+0

위의 코드 중 일부는 아닙니다. 간단히 말해서, 내가하고 싶은 것은 bar에서 find_or_create_by를 실행 한 다음 Foo에서 find_or_create_by에 대한 결과를 사용하는 것입니다. –

답변

1

난 당신이 이런 식으로 작업을 수행 할 수 있습니다 추측 '라벨', bar_id : Bar.find_or_create_by (대상 :

f = Foo.find_or_create_by(label: 'label', bar: Bar.find_or_create_by(object: 'object')) 

F = Foo.find_or_create_by (라벨에 해당합니다 ' id ')

Bar가 생성되었는지 (유효성 검사 실패없이) 확인하려면 두 줄로 만들 수 있습니다.