0

연관을 통해 has_many를 사용할 때 단일 연관에 액세스 할 수있는 (깨끗한) 방법이 있습니까? 나는 성분이 선택되어있는 경우, 그러나레일에서 has_many에서 단일 연관을 선택하십시오.

@ingredients = @recipe.ingredients

을하고, 나는에 대한 조인 테이블에 데이터를 추가 할 :

예를 들어, 레시피의 성분을 모두 얻을, 나는 쓸 수 있습니다 recipe/ingredients, 나는 데이터를 추가하는 깨끗한 방법을 이해할 수 없다.

내가

ingredient = Ingredient.find(an_id) 

amount = @recipe.ingredient.amount 

의 방법은 무엇입니까 사용하여 단일 성분 협회의 양에 액세스 할 수 없습니다 조인 테이블에 저장되는 단일 성분 정보를 선택?

+0

당신이 원하는 레시피를 발견 했으므로, 해당 레시피를위한 재료를 찾았습니다. 이 성분 중 하나의 속성을 편집 하시겠습니까? 아니면 이전에 선택한 레서피에 대해 새로운 성분을 추가 하시겠습니까? 또는 채우려는 성분의 다른 조인 테이블이 있습니까? – holaSenor

+0

레시피와 성분에 대한 조인 테이블이 있는데, 조인 테이블은 레시피와 관련된 성분, 즉 각 성분의 양에 관한 정보를 담고 있습니다. –

답변

-1

나는 그런 존재가 어떻게 존재 하는지를 알지 못합니다. 과 관련된 객체가있는 경우 중 하나를 지정해야합니다. 하나는입니다. 그것은 Rails의 제한 사항이 아니라 ... 나는 잘 모르겠다. 이론을 세웠다. 논리? .first (ingredient = @recipe.ingredients.first)과 연결된 객체 중 하나를 가져올 수 있지만 명령을 지정하지 않으면 어느 객체가 될지를 확신 할 수 없습니다. 이미 성분이 변수로 선택한 가정

(가 진정으로 만 확실이 알 수있는 방법을 잘 하나하지. 경우)

+0

그건 재미 있어요 ... 이론을 세우세요. 하나의 레코드 (테이블 자체 또는 일치하는 키를 가진 하나의 레코드 만)는 하나 또는 둘 다의 테이블에 대한 데이터베이스 및 has_many 관계의 한계 내에서 완전히 가능합니다. 그래서 분명히, 그것은 무엇이든의 제한이 아닙니다. 당신이 나를 믿지 않는다면 시도해보십시오. – holaSenor

0

당신은 @ingredient = @recipe.ingredients.first, 당신은 어떤처럼 그들을 설정할 수 수 다른 ActiveRecord 객체.

@ingredient = @recipe.ingredients.first 
@ingredient.amount = 15 #or @ingredient.amount = params[:amount] (if you get the new value from POST) 
@ingredient.unit = "Ounces" 
@ingredient.save 

당신은 당신이 시도 할 수있는보기에서 일부 HTML 태그를 표시 같은 조리법에 대한 각 성분의 특성을 검색하고 그들과 함께 무언가를 할 경우

. 각각의 내부 루프 배열 '정보'의 끝 부분에
@ingredients = @recipe.ingredients 
    @ingredients.each do |ingr| 
    info = %w[amount, brand, id, recipe_id , unit].map do |attr| 
     ingr.send(attr) 
    end 

한 성분의 모든 속성 될 것입니다. (가정 당신이 정보를 배열에 포함)

이 당신이 수도 테이블의 예입니다 협회를 저장하는 데 사용, 그것은 레일 :through => :recipe_ingedient 방법으로 작동합니다 :

CREATE TABLE `recipe_ingredient` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `recipe_id` int(11) NOT NULL, 
    `ingedient_id` int(11) NOT NULL, 
    `created_at` datetime DEFAULT NULL, 
    `updated_at` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci$$ 
+0

어떻게 @ recipe.ingeredient에 액세스 하시겠습니까? 이것은 NameError를 던질 것입니다. # " –

+0

에 대해 정의되지 않은 메소드'재료 '를 던질 것입니다. 내가 한 번에 하나의 재료를 선택하는 뒤에 논리를 이해하지만, 요리법 사이의 조인 테이블에 데이터를 저장하는 가장 효율적인 방법이 무엇인지 궁금합니다. 및 성분. –

+0

recipe_id, ingredient_id – holaSenor

0

의 표는 당신을 위해 중요하다 가입, 그래서 이름이 있어야합니다. recipe_ingredient라고 부를 수 있지만 실제 이름은 정신적으로 혼동하지 않도록 도움을줍니다. (문제에 대해 논의하는 데 도움이됩니다)

예를 들어, slot과 같이 조인 테이블이 호출됩니다.

class Recipe 
    has_many :slots 
    has_many :ingredients, :through => :slots 
    .. 
class Slot 
    belongs_to :recipe 
    belongs_to :ingredient 
    ... 

당신은 여분의 효율성을 위해

@slot = @recipe.slots.where(:ingredients_id => @ingredient).first 
@slot.amount = 20 

를 호출하고 각 조합 한 번만 존재하는지 확인하기 위해에 의해 정의 된 슬롯을 얻을, 당신은 모두에는 Recipe_ID에 걸쳐하는 슬롯의 고유 복합 인덱스를 정의 할 수 있으며, 성분 _id

1

옵션 :select은이 경우 매우 유용합니다.

class Recipe 
    has_many :ingredients, through: ingredients_recipes, select: "ingredinets.*, ingredients_recipes.some_additional_column as some_additional_column" 
    .... 

예를

를 들어 그럼 그냥

Recipe.first.ingredients.first.some_additional_column # => profit! 

당신은 너무 당신의 범위에서 사용할 수 있습니다 호출합니다.

관련 문제