1

2つの別々の多数の関連テーブルを使用して必要なデータを取得するのに問題があります。2つの別個のhas_manyテーブル

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_many :meals 
    has_many :lists 
end 

class Meal < ActiveRecord::Base 
    belongs_to :user 
    has_many :meal_lists 
    has_many :lists, through: :meal_lists 
    has_many :meal_ingredients 
    has_many :ingredients, through: :meal_ingredients 
end 

class List < ActiveRecord::Base 
    has_many :meal_lists 
    has_many :meals, through: :meal_lists 
    belongs_to :user 
end 

class MealList < ActiveRecord::Base 
    belongs_to :meal 
    belongs_to :list 
end 

私の最終結果は、list_idとuser_idの両方に関連付けられているすべての食事を引き出すことができます。

は、これまでのところ、私は両方のuser_idとLIST_IDに関連付けられている食事を引き出す方法を見つけ出すように見えることはできません

@list = @user.lists.create("name: "users list") 
list.meals.create(name:"List name", user_id: user.id) 
list.meals.where(user_id: user.id) 

を試してみました。

編集:最初の答えを読んだ後、ここで私はそれをどのように実装するかを解釈しました。私はまだレールを学ぶ冒頭であり、私はこの問題を何時間も見つめており、私はもっと不明瞭に見えます。

私はモデル内でメソッドを作成しました:

Class List < ActiveRecord::Base 

    def self.find_user_meals(user, list) 
    meal = Meal.joins(:meal_lists) 
    user_meal = meal.where(user: user) 
    list_meal = user_meal.where(meal_lists: { list: list }) 
    return list_meal.distinct 
    end 
end 

と私のコントローラ内:

def edit 
    @list = List.find(params[:id]) 
    user = current_user 
    @meals = Meal.all 
    @all_user_meals = List.find_user_meals(user, @list) 
    end 

そして私はちょうど@all_user_mealsを反復処理する点で好ましいです。私はちょっとしたことをジョイントに読んで、最初の答えの後に含めて、コンソールの中で何かを動作させるように思えました。これは、アプリケーションではあまり働いていない、と私はちょうどそれの周りに私の頭を少し包み込むことを試みている。

DOUBLE EDIT:

だから、私はちょうど疲れていたし、問題をoverthinking推測します。私が気付かなかったのは、リストが1人のユーザによって作成されたので、これをかなり簡単に解決することができたということでした。

def edit 
    @list = List.find(params[:id]) 
    user = current_user 
    @meals = Meal.all.where(user_id: user.id) 
    @listed_meals = @list.meals 
    end 

私はこれにどれくらいの時間を費やしたのでしょうか。これを見て時間を費やしてくれてありがとう。時には団体が私を混乱させることもあります。

答えて

2

あなたは答えるためMealMealList

Meal.joins(:meal_lists) 
    .where(user: @user) 
    .where(meal_lists: { list: @list }) 
    .distinct # because the joins may return duplicate meals if they belong to several lists 
+0

感謝の間の結合を使用してそれを行うことができます。私はちょっと混乱しているので、それがどのように実装されているかという質問でコメントを編集しました。 –

+0

それを考え出した。助けてくれてありがとう! –

関連する問題