相关疑难解决方法(0)

如何在Rails3中使用unscoped关联关系?

由于信息安全限制,我在产品上有默认范围.

class Product < ActiveRecord::Base
  has_many :photos

  default_scope where('visible = 1')
end
Run Code Online (Sandbox Code Playgroud)

但是,在我的相关照片模型中,我还必须找到不可见的产品.

class Photo < ActiveRecord::Base
  belongs_to :product
end

my_photo.product
Run Code Online (Sandbox Code Playgroud)

在其他情况下,我可以使用unscoped来绕过default_scope,例如在Product.unscoped.find_by_title('abc').然而:

如何在使用记录关联时删除范围?

my_photo.unscoped.product因为my_photo没有调用方法,所以没有意义unscoped.也没有my_photo.product.unscoped任何意义,因为my_photo.product可能已经是零.

scope ruby-on-rails arel ruby-on-rails-3

62
推荐指数
5
解决办法
3万
查看次数

default_scope和association

假设我有一个Post模型和一个Comment模型.使用常见模式,Post has_many Comments.

如果Comment设置了default_scope:

default_scope where("deleted_at IS NULL")
Run Code Online (Sandbox Code Playgroud)

无论范围如何,如何轻松检索帖子上的所有评论?这会产生无效结果:

Post.first.comments.unscoped
Run Code Online (Sandbox Code Playgroud)

这会生成以下查询:

SELECT * FROM posts LIMIT 1;
SELECT * FROM comments;
Run Code Online (Sandbox Code Playgroud)

代替:

SELECT * FROM posts LIMIT 1;
SELECT * FROM comments WHERE post_id = 1;
Run Code Online (Sandbox Code Playgroud)

运行:

Post.first.comments
Run Code Online (Sandbox Code Playgroud)

生产:

SELECT * FROM posts LIMIT 1;
SELECT * FROM comments WHERE deleted_at IS NULL AND post_id = 1;
Run Code Online (Sandbox Code Playgroud)

我理解uncoped删除所有现有范围的基本原则,但是它不应该知道并保持关联范围吗?

拉取所有评论的最佳方式是什么?

ruby-on-rails default-scope

25
推荐指数
5
解决办法
8537
查看次数

渴望加载嵌套关联和范围

我是初学者,很难解释我的问题:

我的模特:

class Skill  
  has_many :categories
  has_many :positions, :through => :categories
end

class Category
  belongs_to :skill
  has_many :positions  
end

class Position
  belongs_to :category
  has_one :skill, :through => :category    
end
Run Code Online (Sandbox Code Playgroud)

我可以成功地加载所有内容,如下所示:

@skills = Skill.includes(:positions)
Run Code Online (Sandbox Code Playgroud)

但有时我想在职位上应用范围:

class Position
...
  scope :active, where(:hidden => false)
end
Run Code Online (Sandbox Code Playgroud)

我希望我能做到:

@skills = Skill.includes(:positions.active)
Run Code Online (Sandbox Code Playgroud)

相反,我在视图中应用范围,但是急切加载不再起作用:

<%= skill.positions.acitve ... %>
Run Code Online (Sandbox Code Playgroud)

是否可以同时拥有热切的装载和范围?

ruby-on-rails

5
推荐指数
1
解决办法
2344
查看次数