Ruby on rails 将带参数的查找器方法更改为关联

Ruby on rails 将带参数的查找器方法更改为关联,ruby-on-rails,associations,named-scope,Ruby On Rails,Associations,Named Scope,我怎样才能把它变成一个有一个关联 (可能有一个指定的大小范围。) 。。。这相当酷,而且至少使语法更好一些 然而,这仍然没有我想要的那么好。特别是,它不允许进一步的尼斯查找链接(这样它在获得所有条件之前不会执行此查找) 更重要的是,它不允许在:include中使用。理想情况下,我想这样做: PostsController def show post = Post.get_cache(params[:id]) { Post.find(params[:id], :includ

我怎样才能把它变成一个有一个关联

(可能有一个指定的大小范围。)

。。。这相当酷,而且至少使语法更好一些

然而,这仍然没有我想要的那么好。特别是,它不允许进一步的尼斯查找链接(这样它在获得所有条件之前不会执行此查找)

更重要的是,它不允许在:include中使用。理想情况下,我想这样做:

PostsController
def show
  post = Post.get_cache(params[:id]) {
    Post.find(params[:id], 
      :include => {:comments => {:users => {:avatar_asset => :thumb}} }
  ...
end
。。。这样我就可以将这些资产和帖子一起缓存。或者缓存它们,真的-例如,
get\u cache(user\u id){user.find(user\u id,:include=>:avatar\u assets)}
将是一个很好的第一步

这实际上不起作用(self==User),但在精神上是正确的:

has_many :avatar_assets, :foreign_key => 'creator_id', 
 :class_name => 'Asset', :conditions => ["filename LIKE ?", self.login + "_%"]

(也发布在。)

因为实际上有多个
化身资产(每个大小一个),所以你必须保留它,因为
有很多关联

class User < AR::B
  has_many :avatar_assets, :conditions => ['filename like ?' '%avatar%'], :class_name => 'Asset'

  named_scope :avatar_size, lambda { |size|
    { :conditions => [ "thumbnail = ?", size ] }
  }
end
但当你发现自己在说

current_user.avatar_for( current_user, :size => :medium )
您可以向用户添加一些
:avatar
:avatar?
等方法来清理此问题

我个人建议你检查一下回形针插件,完全避免这些问题

编辑:

根据你的评论,要创建一个条件,比如“通过有用户的头像向我显示评论”,我不确定这样做是否可行。你可以建立这样的关系:

class Comment
  named_scope :with_avatars, :include => { :user => :avatar_assets }, :conditions => [ 'assets.thumbnail = ?', :thumb ]

end
编辑:

由于您只对缓存感兴趣,而不是对条件感兴趣,我们可以删除条件数组:

  named_scope :with_avatars, :include => { :user => :avatar_assets }

我修改了上面的代码,使其更具可操作性。关键的区别在于使资产的“化身”(avatar)易于查询。如果您可以更新现有的化身资源,使其具有包含模式“化身-[login]”的文件名,则可以将条件设置为静态,这比总是基于用户登录搜索化身要干净得多。关联扩展是解决此问题的另一种方法,但是我认为您无法将它们链接起来,或者将它们与命名范围结合起来。

我实际上看了一眼回形针;它缺少一些我碰巧需要的更复杂的功能。(在我的应用程序中,资产在许多地方被非平凡地使用,有时是多态的;每个资产类型有一个psuedocolumn是不好的。)还有-有没有什么方法可以让我做一些类似于:Post.find(1)的事情呢?。。。另外,您的代码也不起作用。即使添加了必要的:class\u name和:foreign\u key,您的化身资产也会弹出:
未知列“users.asset\u id”
,因为它不知道它在哪个用户上。但我认为这正引导我走向更好的方向;需要重新阅读关于association extensions.Re的内容。你的编辑-这不是我的意思。它是“包括对这篇文章发表评论的用户的化身,这样我就可以缓存整个该死的东西”。不是“只找到有用户的头像的评论”。
Asset.avatar_for(current_user, :size => :medium)
current_user.avatar_for( current_user, :size => :medium )
class Comment
  named_scope :with_avatars, :include => { :user => :avatar_assets }, :conditions => [ 'assets.thumbnail = ?', :thumb ]

end
  named_scope :with_avatars, :include => { :user => :avatar_assets }