我遇到了一个非常狡猾的问题.这是我的模特:
class Entry < ActiveRecord::Base
default_scope :order => 'published_at DESC'
named_scope :published, :conditions => ["published_at < ?", Time.zone.now], :order => 'published_at DESC'
belongs_to :blog
end
Run Code Online (Sandbox Code Playgroud)
现在,如果我这样做
@entries = Entry.published.paginate_by_blog_id @blog.id,
:page => params[:page],
:order => 'published_at DESC',
Run Code Online (Sandbox Code Playgroud)
除非我将published_at移回一小时,否则它不会返回帖子.但:
@entries = Entry.paginate_by_blog_id @blog.id,
:page => params[:page],
:conditions => ["published_at < ?", Time.zone.now],
:order => 'published_at DESC',
Run Code Online (Sandbox Code Playgroud)
它工作正常!
我在这里疯了,任何人都有任何想法甚至开始调试?
我正在使用ruby on rails和结果页面上的调查应用程序,我想让用户通过我在调查开始时提出的一系列人口统计问题来过滤答案.
例如,我问用户他们的性别和职业是什么.所以我在想性别和职业的下拉.两个下拉菜单都会默认为全部,但如果用户选择了女性和营销人员,那么我的结果页面只会给女性营销人员提供答案.
我认为这样做的正确方法是使用named_scopes,我的每个人口统计学问题都有一个named_scope,在本例中为性别和职业,这将从下拉列表中获取一个消毒值,以便在条件下使用我不确定如何动态创建named_scope链,因为我有5个人口统计学问题,并且可能其中一些将被设置为全部.
有没有办法做到这一点(psedo代码):
GetCurrentThread().Items.Add(new RefObject);
Run Code Online (Sandbox Code Playgroud)
然后再回顾它
RefObject[] refObjs = GetCurrentThread().Items;
Run Code Online (Sandbox Code Playgroud)
并枚举对象.显然,这两个调用都会在它的生命周期内发生在同一个线程上.
基本的想法是,我可以轻松识别当前线程的项目,并且它们实际上是在此线程中创建的.它与将Page.Request对象用于ASP.NET请求相同 - 您知道它在工作进程中非常独特,因此它不会与同时提供的其他请求混淆.我想对待一个线程Page.Request- 它来然后去,但是当它还活着时,我可以随意查询它而不关心过程中存在的其他威胁.
一旦我做了类似的事情,但它更多的是通过引用编组对象的模拟.我可以想到几种方法,但我真的不想自己手动存储线程和对象之间的映射.对于.NET中的线程,是不是有类似于TransactionScope的东西?我不太喜欢处理同步困难和避免竞争条件.
PS:如果没有,我是否可以至少为没有静态变量的应用程序域做到这一点?
我无法在任何地方找到答案,而且我今天没有留下脑力来想办法自己确认一下.
我有这样的命名范围......
named_scope :fresh, :conditions => ['updated_at > ?', 4.hours.ago]
Run Code Online (Sandbox Code Playgroud)
我不知道这是否会按照我想要的方式运作.我的一部分认为4.hours.ago将在加载类文件时解析,而另一部分认为4.hours.ago将在使用时展开.
谢谢您的帮助!
我的应用程序中有四个模型,定义如下
class User < ActiveRecord::Base
has_many :comments
has_many :geographies
has_many :communities, through: :geographies
class Comment < ActiveRecord::Base
belongs_to :user
class Community < ActiveRecord::Base
has_many :geographies
has_many :users
class Geography < ActiveRecord::Base
belongs_to :user
belongs_to :community
Run Code Online (Sandbox Code Playgroud)
用户可以通过地理位表发布与一个或多个社区相关联的评论.
我的任务是仅显示从下拉列表中选择的社区的评论.我从这篇文章中了解到,我可以通过comment.user.communities.first对象链访问给定评论的社区.
看起来通常带有lambda的named_scope将是筛选所有注释列表的首选,但是,我完全不知道如何构造这个named_scope.我试图通过跟随一些RailsCasts来构造named_scope,但这是我能够得到的.生成的错误如下.
class Comment < ActiveRecord::Base
belongs_to :user
def self.community_search(community_id)
if community_id
c = user.communities.first
where('c.id = ?', community_id)
else
scoped
end
end
named_scope :from_community, { |*args| { community_search(args.first) } }
Run Code Online (Sandbox Code Playgroud)
这是错误:
syntax error, unexpected '}', expecting tASSOC
named_scope :from_community, …Run Code Online (Sandbox Code Playgroud) 直截了当的问题.我有这样的查询:
@issue_books = current_user.issue_books
@already_issues = @issue_books.taken(params[:id])
Run Code Online (Sandbox Code Playgroud)
takennamed_scope 在哪里定义如下:
scope :taken, lambda { |book_id| where(returned: false).where(book_id: book_id) }
Run Code Online (Sandbox Code Playgroud)
现在每次我运行此查询:
@issue_books.taken(params[:id])
Run Code Online (Sandbox Code Playgroud)
我收到一个ArgumentError: wrong number of arguments (1 for 0)错误.
如果我重命名taken为其他东西taken_books,似乎一切正常.
所以我的问题是:takenruby中的关键字是什么?如果没有人可以解释这种行为?
我试图使用Rails的魔力实现我认为将是一个相当复杂的查询,而不会在代码中看到很多丑陋的SQL.
由于我的数据库处理的是相当专业的生物医学模型,我将把以下内容翻译成更真实的场景.
我有一本模特书
has_many:章节
和那章
belongs_to:书
例如,章节有一个名称属性,名称可以是前言,介绍和附录,一本书可以有一个名为前言的章节和一个名为引言的章节,但没有章节命名为附录.实际上是这些的任何组合
我希望找到所有包含章节命名前言和介绍的书籍.
目前我有一个named_scope如下
Book
named_scope :has_chapter?, lambda { |chapter_names|
condition_string_array = []
chapter_names.size.times{condition_string_array << "chapters.name = ?"}
condition_string = condition_string_array.join(" OR ")
{:joins => [:chapters] , :conditions => [condition_string, * chapter_names]}
}
Run Code Online (Sandbox Code Playgroud)
如果我打电话给Book.has_chapter?["前言","引言"]这将找到我所有的书籍,其中有一章名为序言或介绍.我怎么能这样做会找到我分离株类似的事情都记前言和简介?
我不熟悉SQL,所以我不太确定需要什么样的连接以及是否可以在命名范围内实现.
非常感谢
安东尼
我试图通过提供一个继承的公共基础模型来概括我的一些模型,其中包含一些相互的named_scope声明和一个激活搜索的过滤器方法,以便在控制器端进行更简单的查询.这在我在控制台中运行时似乎有效,但在控制器中失败:
# in the base model
class GenericModel < ActiveRecord::Base
named_scope :by_name, lambda { |name|
( name.blank? ) ? {} : { :conditions => [ "#{self.table_name}.name like ?", "%#{name}%" ] }
}
def filter(params)
res = []
res = self.by_name( (params[:name] or '') ) if params[:name]
return res
end
end
class MyModel < GenericModel
set_table_name 'my_models'
end
# works in in console!
>> params = { :name => 'jimmy' }
>> MyModel.filter(params)
=> [ <#MyModel ...>, ... ]
nil
# …Run Code Online (Sandbox Code Playgroud) 这个命名范围工作正常.
named_scope :search, lambda {|search_txt|
{
:conditions => ["field1 like ? or field2 like ? or field3 like ?","#{search_txt}%","#{search_txt}%","#{search_txt}%"]
}
}
Run Code Online (Sandbox Code Playgroud)
而不是在条件下三次写search_txt.在条件中只传递一次search_txt可以处理相同的场景吗?
就像是
named_scope :search, lambda {|search_txt|
{
:conditions => ["field1 like ? or field2 like ? or field3 like ?","#{search_txt}%"]
}
Run Code Online (Sandbox Code Playgroud)
}
是否可以在rails模型中的范围参数中添加OR语句
scope :west_coast, where(:st => "CA" || "WA" || "OR")
Run Code Online (Sandbox Code Playgroud) named-scope ×10
activerecord ×4
ruby ×2
scope ×2
.net ×1
associations ×1
filter ×1
filtering ×1
inheritance ×1
lambda ×1
timezone ×1