Цикл в активном админе - PullRequest
0 голосов
/ 21 мая 2018

Я хочу добавить пары ключей и значений к результату (из строки), поэтому я сделал так:

      row :skill_level do |user|
        level = {}
        user.try(:sport_memberships).each do |sport|
          sport_name  = Sport.where(id: sport.try(:sport_id)).try(:name)
          sport_level = sport.try(:level)
          level       = level.merge!("#{sport_name.to_sym}" => sport_level)
        end
      end

Ассоциация моделей:
user.rb

has_many :sport_memberships,
           inverse_of: "user",
           class_name: "Sport::Membership"

sport.rb

has_many :memberships

members.rb

belongs_to :sport, inverse_of: "memberships", counter_cache: true
belongs_to :user, inverse_of: "sport_memberships"

Я ожидал, что уровень вернет значение, например: {badminton: 2, golf: 2},но фактические результаты: [#<Sport::Membership id: 5024, sport_id: 4, user_id: 976, level: 2, tribe_id: nil>, #<Sport::Membership id: 5025, sport_id: 14, user_id: 976, level: 2, tribe_id: nil>].Кажется, моя петля не прошла как ожидалось.Как я могу исправить мою проблему?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Похоже, вы пытаетесь создать хеш, вы можете сделать это так:

row :skill_level do |user|
  user.sport_memberships.each_with_object({}) do |mem,hsh|
    hsh[mem.sport.name] = mem.sport.level
  end.to_s
end

Однако вы также можете создать такую ​​строку:

row :skill_level do |user|
  user.sport_memberships.map do |mem|
    "#{mem.sport.name}: #{mem.sport.level}"
  end.join(", ")
end

По желанию,Чтобы повысить производительность индекса, добавьте в свою регистрацию следующее:

controller do
  def scoped_collection
    super.include(sports_memberships: [:sports])
  end
end
0 голосов
/ 21 мая 2018

в первую очередь отменяет действие контроллера

Не проверено

 def index 
   super
   @levels = User.joins(sport_memberships: :sport).where(id: resource.id).select("sports.name, sport_memberships.level").group("sports.name, sport_memberships.level")
 end

Пожалуйста, попробуйте этот запрос, дайте мне знать, работает ли он или нет.

...