如何获取属于rails中另一个模型的模型的关系

时间:2016-02-01 20:51:44

标签: ruby-on-rails ruby-on-rails-4 model-view-controller activerecord rails-activerecord

我有两个模型:OptionAnswer。选项has_many :answers和答案belongs_to :option。我有一个名为@answers的变量:

@answers = Answer.where(content: 'a')

我现在需要与所有与@answers相关的选项建立关系。我试过了:

@options = @answers.joins(:option)

但是这会返回一系列答案,而不是选项。如何从@answers获得选项关系?

5 个答案:

答案 0 :(得分:1)

def create
  build_resource(sign_up_params)

        resource.save
        yield resource if block_given?
        if resource.persisted?
            if resource.active_for_authentication?
                set_flash_message :notice, :signed_up if is_flashing_format?
                sign_up(resource_name, resource)
                respond_with resource, location: after_sign_up_path_for(resource)
            else
                set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format?
                expire_data_after_sign_in!
                respond_with resource, location: after_inactive_sign_up_path_for(resource)
            end
        else
            clean_up_passwords resource
            set_minimum_password_length
            if params[:role].present?
                render :new_with_role
            else
                respond_with resource
            end
        end
end

效率低下:

Option.joins(:answers).where(answers: { content: 'a' })

或没有加入:

Option.joins(:answers).where(answers: { id: @answers.pluck(:id) })

或者在Answer类上使用范围并合并:

Option.where(id: @answers.pluck(:option_id).uniq)

答案 1 :(得分:0)

只需调用option方法:

@answers = Answer.where(content: 'a').map(&:option)

答案 2 :(得分:0)

如果您确实需要@answers,请执行此操作以获得更好的效果:

@answers = Answer.where(content: 'a')
@options = Option.where('id in (?)', @answers.map(&:option_id).uniq)

这样你只需要2个查询(避免n + 1)

答案 3 :(得分:0)

你可以吗

@answers = Answer.where(content: 'a')
@options = @answers.options.find(params[:id])

..或您想要使用的任何选项参数。

答案 4 :(得分:0)

希望这会有所帮助:

你可以急于加载选项'与每个答案相关联

@answers = Answer.where(content: 'a').includes(:option)

然后在不运行查询的情况下获取选项

@options = @answers.map(&:option)

请注意,这会返回一个activerecord关系数组,而不仅仅是一个数组。