У меня есть приложение Rails с моделью пользователя, который устанавливает другу отношения, как этотдоступа ассоциация ассоциации
User.rb
has_many :friendships
has_many :friends, :through => :friendships
Каждый пользователь имеет has_many
ассоциацию с моделью Recipe.rb
В моем приложении я хочу публиковать рецепты на странице показа пользователей от друзей этого пользователя. то есть пройти через ассоциацию друзей, чтобы получить рецепты друзей. Поэтому, я делаю это в users_controller.rb
def show
@friend_recipes = []
@user.friendships.each do |friendship|
@friend_recipes << User.recipes_by_friends(friendship.friend_id)
end
end
который вызывает метод класса recipes_by_friends
на модели пользователя
User.rb
scope :recipes_by_friends, lambda { |friend_id|
joins(:recipes).
where(recipes: {user_id: friend_id})
}
В пользовательском шоу странице, я стараюсь показать каждый из рецептов. Однако в приведенном ниже коде локальная переменная рецепта фактически является активным отношением записи для друга, а не рецептами для друга.
/views/users/show.html.erb
<% @friend_recipes.each do |recipe| %></li>
<%= recipe.inspect %> ## this is the relation for the user, not the recipe
<% end %>
Как следует изменить метод Scope (или изменить что-то еще?) В модели пользователя, чтобы получить рецепты?
Это лучший способ связаться с друзьями и добавить их рецепты в массив?
@user.friendships.each do |friend| @friend_recipes << User.recipes_by_friends(friend.friend_id) end
Для # 2, я бы use @ user.friendships.map {| v | блок}. Если бы блок мог возвратить nil, добавьте с .compact – rdmcfee
Спасибо. Вы знаете, как изменить метод области, чтобы он возвращал рецепты, а не друг? – BrainLikeADullPencil
'recipes_by_friends' - это запрос, поэтому он возвращает коллекцию совпадений. В вашем случае, я думаю, вы принимаете один матч? В этом случае вы можете сделать: '<% = recipe.first.inspect%>'. Если есть кратные, вам может понадобиться «внутренний каждый»: '<% recipe.each do | r | %> ... '. – lurker