我有两个模型:Option
和Answer
。选项has_many :answers
和答案belongs_to :option
。我有一个名为@answers的变量:
@answers = Answer.where(content: 'a')
我现在需要与所有与@answers相关的选项建立关系。我试过了:
@options = @answers.joins(:option)
但是这会返回一系列答案,而不是选项。如何从@answers获得选项关系?
答案 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关系数组,而不仅仅是一个数组。