【问题标题】:How can i map one query result to another query result in ruby on rails如何在 ruby​​ on rails 中将一个查询结果映射到另一个查询结果
【发布时间】:2016-05-31 06:34:21
【问题描述】:

您好,我是 Ruby on Rails 开发的新手。我有两个不同型号的查询。我的 first_query 是从问题模型中获取的,第二个查询是从最喜欢的模型中获取的。我想用列 user_favourite 从第二个查询结果映射到第一个查询结果。

这是我的控制器查询

def index
    @first_query = Question.order('created_at DESC').page(params[:page]).per( (ENV['ILM_QUESTIONS_PER_PAGE'] || 5).to_i )
    @second_query=Favourite.with_user_favourite(@user)
    @combined_queries = @first_query + @second_query
end

最喜欢的.rb

scope :with_user_favourite, -> (user) {
    joins(:user).
    where(favourites: {user_id: user})
  }

index.json.builder

json.questions @combined_events

结果的json是

{
questions: [      #this is first query result
        {
            id: 88,
            user_id: 28,
            content: "test32",
            image: {
            url: null,
            thumb: {
                url: null
            },
            mobile: {
                url: null
            }
            }
        },
        {
            id: 87,
            user_id: 18,
            content: "testing riyas",
            image: {
            url: null,
            thumb: {
                url: null
            },
            mobile: {
                url: null
            }
            }
        },
        {              #this is second query result
            id: 1,
            user_id: 2,
            question_id: 84,
            created_at: "2016-05-12T06:51:54.555-04:00",
            updated_at: "2016-05-12T06:51:54.555-04:00"
        },
        {
            id: 2,
            user_id: 2,
            question_id: 81,
            created_at: "2016-05-12T07:23:47.770-04:00",
            updated_at: "2016-05-12T07:23:47.770-04:00"
        }
    ]
}

我想要这样的回应

{
questions: [      
        {                            #first query result
            id: 88, 
            user_id: 28,
            content: "test32",
            image: {
            url: null,
            thumb: {
                url: null
            },
            mobile: {
                url: null
            }
            },
            user_favorite: {       #corresponding result from second query result
                id: 1,
                user_id: 2,
                question_id: 88
            }
        },
        {                           #first query result
            id: 87,
            user_id: 18,
            content: "testing riyas",
            image: {
            url: null,
            thumb: {
                url: null
            },
            mobile: {
                url: null
            }
            },
            user_favorite: {}       #corresponding result from second query result if there is no result for particular question in favourite table
        },
    ]
}

模型关系是:

class Question
  belongs_to :user
  has_many :favourite
end

class Favourite
  belongs_to :user
  belongs_to :question
end

class User
  has_many :questions
  has_many :favourite
end

【问题讨论】:

  • Question 模型、Favorite 模型和 User 模型之间的关系是什么?
  • 添加您的关联
  • in question.rb belongs_to :user has_many :favourite in favourite.rb belongs_to :user belongs_to :question in user.rb has_many :questions has_many :favourite
  • 你要么使用 rails 3 要么使用 rails 4 - 不能同时使用。运行rails --version - 你使用的是什么版本?
  • @Riyaskhan 您可以使用问题下方的edit 按钮(直接在这些 cmets 上方)为您的问题添加新信息。请这样做,而不是将代码粘贴到 cmets 中。我已将您的模型关系放在问题中,您应该对包含的任何其他信息执行相同操作。

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4


【解决方案1】:

您应该修改您的 jBuilder 模板以支持嵌套。由于您的模型关联就像一个问题 has_many 最喜欢的,所以它将是一个数组,您可以轻松地将一个对象嵌套在另一个对象中。

 json.array! @questions do |question| 
    json.user_id question.user_id
    json.content question.content
    json.user_favorites question.favorites do |json,favorite|
       json.id question.favorite.id
       json.user_id question.favorite.user.id
       json.question_id question.id
    end 
end

这里有一个链接,您可以参考一下以获得更清晰的信息。

Generate a nested JSON array in JBuilder

Using JBuilder to create nested JSON output in rails

希望对你有帮助!

【讨论】:

  • 我得到了这个错误 .undefined method `favorites' for #<0x000000067ffca0>
【解决方案2】:

您可以在user_favouritequestion 之间添加关联,以便您可以在一个问题上选择所有用户收藏夹。

问题.rb:

has_many :user_favourites

UserFavourite.rb:

belongs_to :question

然后,作为您的网络操作:

def index
  @questions = Question.all.order('created_at DESC').page(params[:page]).per((ENV['ILM_QUESTIONS_PER_PAGE'] || 5).to_i)
end

最后,在 index.json.builder 中:

json.questions @questions do |question|
  json.user_favourites question.user_favourites
end

包括您想要的任何其他字段。

【讨论】:

    猜你喜欢
    • 2014-08-18
    • 2016-02-01
    • 2011-12-02
    • 2020-08-25
    • 2011-09-16
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多