0

関連付けを介して has_many を使用するときに、単一の関連付けにアクセスする (クリーンな) 方法はありますか?

たとえば、レシピのすべての材料を取得するには、次のように記述できます。

@ingredients = @recipe.ingredients

ただし、材料が既に選択されていて、レシピ/材料の結合テーブルにデータを追加したい場合、データを追加するきれいな方法がわかりません。

を使用して単一成分協会の金額にアクセスできません

ingredient = Ingredient.find(an_id)  

amount = @recipe.ingredient.amount

結合テーブルに格納されている単一の成分情報を選択する方法は何ですか?

4

4 に答える 4

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!

スコープでも使用できます。

于 2012-06-26T23:42:54.220 に答える
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

各内部ループの最後で、配列「情報」は1つの成分のすべての属性になります(情報配列にそれらを含めると仮定します)

これは関連付けを保存するために使用できるテーブルの例です。これは rails: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$$
于 2012-06-25T17:14:24.827 に答える
0

結合テーブルは重要なので、名前を付ける必要があります。これをレシピ_材料と呼ぶこともできますが、実際の名前は物事を精神的に混乱させないのに役立ちます. (そして、問題について話し合うのに役立ちます)

たとえば、結合テーブルが呼び出されるとします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

効率性を高め、各組み合わせが 1 回だけ存在するようにするために、スロットの一意の複合インデックスを定義して、レシピ ID と食材 ID の両方にまたがることができます。

于 2012-06-26T21:42:18.600 に答える
-1

どうしてそんなものが存在できるのかわかりません。関連付けられたオブジェクトが多数ある場合は、必要なオブジェクトを指定する必要があります。それは Rails の制限ではなく、集合論の制限です。わかりません。論理?関連するオブジェクトの 1 つを.first( ingredient = @recipe.ingredients.first) で取得できますが、順序も指定しない限り、それがどれになるかを確認する方法はありません。

于 2012-06-25T17:04:36.133 に答える