- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用 Rails 2.3.9。我知道指定 :joins
没有明确的查询中的选项 :select
自动将返回的任何记录设为只读。我有一种情况,我想更新记录,虽然我已经阅读了不同的方法来处理它,但我想知道哪种方式是首选或“正确”的方式。
具体来说,我的情况是我有以下User
带 active
的模型使用 subscriptions
执行 JOIN 的命名范围 table :
class User < ActiveRecord::Base
has_one :subscription
named_scope :active, :conditions => { :subscriptions => { :status => 'active' } }, :joins => :subscription
end
User.active.all
,返回的用户记录都是只读的,例如,如果我调用
update_attributes!
在用户上,
ActiveRecord::ReadOnlyRecord
将被提升。
:readonly => false
到查询。但是,我想知道以下几点:
SELECT `users`.*
无论如何,这似乎是安全的,那么 Rails 首先要防范什么? 当 :select
出现时,Rails 应该警惕这种情况。实际上是明确指定的,这与实际行为相反,所以我没有正确理解在 :joins
上自动设置只读标志的目的吗? ? :readonly => false
似乎不合适。 .如果命名范围与其他命名范围链接,我也害怕副作用。如果我尝试在范围之外指定它(例如,通过执行 User.active.scoped(:readonly => false)
或 User.scoped(:readonly => false).active
),它似乎不起作用。 :joins
到
:include
.我更了解这种行为,但是
这样做有什么缺点吗(除了不必要地读取 subscriptions
表中的所有列)?
User.find_all_by_id(User.active.map(&:id))
使用记录 ID 再次检索查询。 ,但我发现这更像是一种解决方法,而不是可能的解决方案,因为它会生成额外的 SQL 查询。
最佳答案
我相信在这种情况下使用 :include
是习惯和可接受的。而不是 :join
.我认为:join
仅在极少数特殊情况下使用,而 :include
很常见。
如果您不打算更新所有事件用户,那么添加一个额外的命名范围或查找条件以进一步缩小您加载的用户的范围可能是明智的,这样您就不会不必要地加载额外的用户和订阅.例如...
User.active.some_further_limiting_scope(:with_an_argument)
#or
User.active.find(:all, :conditions => {:etc => 'etc'})
:join
,并且只会更新一小部分已加载的用户,那么最好在执行此操作之前仅重新加载您想要更新的用户。如...
readonly_users = User.active
# insert some other code that picks out a particular user to update
User.find(readonly_users[@index].id).update_attributes(:etc => 'etc')
:join
,并且您可能会更新大部分或所有用户,那么您使用一组 ID 重新加载他们的想法可能是您的最佳选择。
#no need to do find_all_by_id in this case. A simple find() is sufficient.
writable_users_without_subscriptions = User.find(Users.active.map(&:id))
关于ruby-on-rails - 防止 ActiveRecord::ReadOnlyRecord 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7667052/
我有一个 购买 型号has_one 优惠券 . 购买 模型包含此代码: def decrement_coupon coupon = Coupon.find_by_code(coupon_code,
我目前正在使用 Rails 2.3.9。我知道指定 :joins没有明确的查询中的选项 :select自动将返回的任何记录设为只读。我有一种情况,我想更新记录,虽然我已经阅读了不同的方法来处理它,但我
我正在尝试创建我的应用程序的只读版本,并让猴子修补 ActiveRecord::Base 以便它在所有模型中为 readonly? 返回 true: module ActiveRecord cla
接下来是 this之前的问题,已回答。我实际上发现我可以从那个查询中删除一个连接,所以现在工作查询是 start_cards = DeckCard.find :all, :joins => [:car
我正在将 Rails 应用程序从 2.3.10 升级到 3.0.4,并且在更新 Controller 中的模型时遇到了问题。我一直在“确定”模型发现,以防止用户更新不属于他们的对象。它在 2.3 中按
我有一个看起来像这样的 rake 任务: desc "Cleanup Snippets with Empty Diffs" task cleanup_snippets_with_empty_diffs
我最近开始在一个项目中使用 ActiveAdmin,几乎所有东西都运行良好,但是在将它与friendly_id gem 结合使用时遇到了问题。由于其 ID 为只读的friendly_id 属性,我为我
它发生在 lp.save 线上。这很奇怪,因为我有相同的代码(虽然略有不同)用于重新排序 link_pages。 菜单栏和链接页是一个有和属于很多关系 这是在 menu_bar/destroy 方法中
我是一名优秀的程序员,十分优秀!