Rails 4 - 从已过滤的 Active Record 查询中删除属性
Posted
技术标签:
【中文标题】Rails 4 - 从已过滤的 Active Record 查询中删除属性【英文标题】:Rails 4 - Remove attributes from an already filtered Active Record query 【发布时间】:2018-04-13 07:02:40 【问题描述】:在我的一个 ruby on Rails 4 控制器中,我有一个方法可以将必要的数据注入到视图中。
所需的数据在 html 所需的数据和 javascript 所需的数据之间有所不同。我正在使用gon 将数据注入到 js 脚本中。
我的应用程序运行良好,但 gon 正在注入 HTML(仅供参考,在正文标记下方的脚本中)数据过多,因为我只需要 Gon/Javascript 所需的 5 个属性中的 2 个HTML 视图。 (希望的原因:当我加载很多对象时,HTML文件的字节差异非常显着)
def inject_deal_steps_data
# Used in html view
@steps = @deal.steps.select(:attribute1,
:attribute2,
:attribute3,
:attribute4,
:attribute5). order(attribute4: :asc)
# Used in js file
gon.push( deal_steps: @steps ) if @steps
end
我尝试使用下面的 unscope 等方法,但没有成功。
def inject_deal_steps_data
# Used in html view
@steps = @deal.steps.select(:attribute1,
:attribute2,
:attribute3,
:attribute4,
:attribute5). order(attribute4: :asc)
# Used in js file
gon.push( deal_steps: @steps.unscope(:attribute1,:attribute3,:attribute4 ) if @steps
end
我不想像下面这样创建另一个新选择,因为它会在数据库上创建一个新请求/命中。
@steps = @deal.steps.select(:attribute1,
:attribute2,
:attribute3,
:attribute4,
:attribute5). order(attribute4: :asc)
gon.push( deal_steps: @deal.steps.select(:attribute2,:attribute5) ) if @deal.steps
我想为 GON 重新使用为 HTML 创建的相同 @steps,但从中删除 3 个属性。
【问题讨论】:
【参考方案1】:您可以使用as_json
来控制to_json
将公开的内容。 gon
在内部调用to_json
,以便将ruby
对象转换为javascript
对象并将其公开给视图。
尝试以下方法:
def inject_deal_steps_data
# Used in html view
@steps = @deal.steps.select(
:attribute1,
:attribute2,
:attribute3,
:attribute4,
:attribute5
).order(attribute4: :asc)
# Used in js file
gon.push(
deal_steps: @steps.as_json(except: [:attribute1,:attribute3,:attribute4])
) if @steps
end
查看as_json
了解更多信息。
【讨论】:
以上是关于Rails 4 - 从已过滤的 Active Record 查询中删除属性的主要内容,如果未能解决你的问题,请参考以下文章
在 Ruby on Rails 4 中使用 Active Record 或 Squeel Gem 重写 SQL 查询
在 Rails 4 中用于 JSON 处理的 jbuilder vs rails-api/active_model_serializers
如何在视图中显示支付网关响应消息 - Rails 4,Active Merchant