假设我有一个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删除所有现有范围的基本原则,但是它不应该知道并保持关联范围吗?
拉取所有评论的最佳方式是什么?
我们计划将我们的应用程序升级到Rails3.我们使用过的一个插件是nested_has_many_through.这个插件似乎过时了,不再维护,并且似乎没有在新的Rails3应用程序中工作.
一个简单的例子:
Author.rb
has_many :posts
has_many :categories, :through => :posts, :uniq => true
has_many :related_posts, :through => :categories
Post.rb
belongs_to :author
belongs_to :category
Category.rb
has_many :posts
Run Code Online (Sandbox Code Playgroud)
任何人都可以推荐最好的练习方式来处理这个,或者一个工作的Rails3插件?
谢谢!!
我相信这是Rails 3中的一个错误.我希望有人能指引我朝着正确的方向前进.下面发布的代码纯粹是为了说明这个问题.希望这不会混淆问题.
鉴于我有一个Post模型和一个Comment模型.发表has_many评论,评论发表于发帖.
在Post模型上设置default_scope,定义join()和where()关系.在这种情况下,()依赖于连接().
通常帖子不依赖于评论.再说一遍,我只想举一个简单的例子.当where()依赖于join()时,这可能是任何情况.
class Post < ActiveRecord::Base
has_many :comments, :dependent => :destroy
default_scope joins(:comments).where("comments.id < 999")
end
class Comment < ActiveRecord::Base
belongs_to :post, :counter_cache => true
end
Run Code Online (Sandbox Code Playgroud)
运行以下命令:
Post.update_all(:title => Time.now)
Run Code Online (Sandbox Code Playgroud)
生成以下查询,并最终抛出ActiveRecord :: StatementInvalid:
UPDATE `posts` SET `title` = '2010-10-15 15:59:27' WHERE (comments.id < 999)
Run Code Online (Sandbox Code Playgroud)
同样,update_all,delete_all,destroy_all的行为方式相同.当我的应用程序在尝试更新counter_cache时抱怨时,我发现了这种行为.最终深入研究update_all.
我目前正在遇到一个奇怪的问题,我们的用户正在退出.我无法明确地重现它.
Rails应用程序使用默认的CookieStore.
我最初的假设是,某种程度上 cookie中的会话数据,甚至cookie本身都被破坏了.这可能来自用户清除浏览器数据,也可能是系统中尚未捕获的内容.
截至目前,身份验证系统似乎正在按预期运行(Authlogic),我们在应用程序的其他组件中没有遇到广泛的问题.
我正在考虑使用ActiveRecordStore来查看问题是否已解决.我的理解是会话数据将存储在数据库中,如果删除了cookie,用户将无法注销.
使用CookieStore和ActiveRecordStore有很多已知的优点/缺点吗?
为什么在创建Rails应用程序时,CookieStore是默认值,而不是ActiveRecordStore?