gpt4 book ai didi

ruby-on-rails - 使用 Rails 的 select() 添加(而不是覆盖)选定的属性?

转载 作者:行者123 更新时间:2023-12-04 05:08:53 26 4
gpt4 key购买 nike

我有一个方便的范围 includes加速表格渲染等的相关模型:

class Post < ApplicationRecord
...

scope :includes_for_post_row, -> { includes(:reasons).includes(:feedbacks => [:user]) }

它工作正常。但是,现在我想 select一个附加属性。如果我已经知道我想要什么初始属性,我可以这样做(在控制台中):
2.3.3 :005 > Post.select("`posts`.*, 42 AS column_forty_two").last.column_forty_two
Post Load (1.0ms) SELECT `posts`.*, 42 AS column_forty_two FROM `posts` ORDER BY `posts`.`id` DESC LIMIT 1
=> 42

这假设我知道我想选择 posts.* ,然后我就继续我的 column_forty_two列,一切正常。

我要加 column_forty_two到我的结果,而不影响最初的选择。例如,这应该有效:
p = Post.select("`posts`.*, 8 as column_eight").includes_for_post_row_with_forty_two
p.last.column_forty_two # => 42
p.last.column_eight # => 8
p.last.some_activerecord_property # => value

应该这样:
p = Post.all.includes_for_post_row_with_forty_two.last
p.last.column_forty_two # => 42
p.last.some_activerecord_property # => value

我怎么能 select附加列,不影响或覆盖 .all 默认选择的现有列或我之前的 select ?

最佳答案

如果您深入研究 ActiveRecord 源(Rails 经常需要的任务),you'll see what's going on :

def build_select(arel)
if select_values.any?
arel.project(*arel_columns(select_values.uniq))
else
arel.project(@klass.arel_table[Arel.star])
end
end
select_values是您交给 select 的所有内容的列表默认情况下是一个空数组:
> Model.where(...).select_values
=> []
> Model.where(...).select('a').select_values
=> ["a"]
> Model.where(...).select('a').select('b').select_values
=> ["a", "b"]

当 ActiveRecord 最终开始构建 SELECT 子句时,它要么使用您传递给 select 的内容。 ( if 中的 build_select 分支)或者它使用 table_name.* ( else 中的 build_select 分支)。

您应该能够使用与 build_select 相同的逻辑。用于确保 select_values在你开始添加之前有一些东西,这样你就可以同时执行 ifelse build_select 的分支机构通过预填 select_values默认 table_name.* .您可以修补自己的 select 版本进入 ActiveRecord::QueryMethods模块:
module ActiveRecord
module QueryMethods
def select_append(*fields)
if(!select_values.any?)
fields.unshift(arel_table[Arel.star])
end
select(*fields)
end
end
end

然后说:
> Post.select_append('6 as column_six').to_sql
=> "select `posts`.*, 6 as column_six from ..."

而离开“正常” select单独的行为:
> Post.select('11 as column_eleven').to_sql
=> "select 11 as column_eleven from ..."

当然,您不必修补补丁,但这种事情似乎是合理的。

关于ruby-on-rails - 使用 Rails 的 select() 添加(而不是覆盖)选定的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41399788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com