加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 参考has_many(Rails)中的实例

发布时间:2020-12-17 03:28:47 所属栏目:百科 来源:网络整理
导读:我有一个游戏模型has_many:文本.问题是我必须根据他们属于哪个游戏来区分不同的文本(是的,丑陋的,但它是遗留数据).我创建了一个Text.in_game_order_query(游戏)方法,它返回适当的顺序. 我最喜欢的解决方案是在Text模型中放置一个默认范围,但这需要知道它们
我有一个游戏模型has_many:文本.问题是我必须根据他们属于哪个游戏来区分不同的文本(是的,丑陋的,但它是遗留数据).我创建了一个Text.in_game_order_query(游戏)方法,它返回适当的顺序.

我最喜欢的解决方案是在Text模型中放置一个默认范围,但这需要知道它们属于哪个游戏.我也不想为每个游戏的文本创建单独的类 – 有很多游戏,有更多的游戏,所有较新的游戏将使用相同的顺序.所以我有另一个想法:在has_many中订购文本,当我知道它们属于哪个游戏时:

has_many :texts,:order => Text.in_game_order_query(self)

但是,self就是这里的类,所以这不起作用.

除了每次调用@ game.texts.in_game_order(@game)之外,真的没有其他解决方案吗?

解决方法

我最近遇到了一个非常类似的问题,我确信在Rails中这是不可能的,但我学到了一些非常有趣的东西.

您可以为范围声明一个参数,然后不将其传入,默认情况下它将传递给父对象!

所以,你可以这样做:

class Game < ActiveRecord
  has_many :texts,-> (game) { Text.in_game_order_query(game) }

信不信由你,你不必传递游戏. Rails会为你神奇地做.你可以简单地做:

game.texts

但有一点需要注意.如果您启用了预加载,这在目前的Rails中将不起作用.如果您这样做,您可能会收到此警告:

DEPRECATION WARNING: The association scope ‘texts’ is instance dependent (the scope block takes an argument). Preloading happens before the individual instances are created. This means that there is no instance being passed to the association scope. This will most likely result in broken or incorrect behavior. Joining,Preloading and eager loading of these associations is deprecated and will be removed in the future.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读