Ruby on rails Rails中的复杂查询 Rails和ActuvReCordd在处理我认为非常简单的处理单个模型的问题上做得非常好。我现在的情况是,我需要做一些稍微复杂一点的事情——但仍然很琐碎——而我不知道如何去做
我有一个Ruby on rails Rails中的复杂查询 Rails和ActuvReCordd在处理我认为非常简单的处理单个模型的问题上做得非常好。我现在的情况是,我需要做一些稍微复杂一点的事情——但仍然很琐碎——而我不知道如何去做,ruby-on-rails,Ruby On Rails,我有一个用户,他有很多:图像。每个图像都有许多缩略图 在我的/images索引页面上,我实际上想为每个登录用户的图像显示小的缩略图。这是一个简单的查询,但因为这样做涉及多个表上的条件,所以我不确定如何以真正的Rails方式进行查询。我宁愿避免编写SQL和处理随之而来的麻烦 我看到rails提供了:joins选项,但这似乎是一个非常不雅观的想法。这是满足这种需求的最佳方式,还是我还没有找到更好的方式 谢谢 更新:有人告诉我命名范围,我不得不承认现在对它们有一些非常不合适的感觉。这些允许相当复杂的条
用户
,他有很多:图像
。每个图像都有许多缩略图
在我的/images
索引页面上,我实际上想为每个登录用户的图像显示小的缩略图。这是一个简单的查询,但因为这样做涉及多个表上的条件,所以我不确定如何以真正的Rails方式进行查询。我宁愿避免编写SQL和处理随之而来的麻烦
我看到rails提供了:joins
选项,但这似乎是一个非常不雅观的想法。这是满足这种需求的最佳方式,还是我还没有找到更好的方式
谢谢
更新:有人告诉我命名范围,我不得不承认现在对它们有一些非常不合适的感觉。这些允许相当复杂的条件被非常优雅地应用,并有大量的语法糖分。例如,我可以在我的图像模型上为给定用户拥有的图像创建一个命名范围,并使其成为动态的:
class Image < ActiveRecord::Base
named_scope :owned_by,
lambda {
|user_id| {
:conditions => { :user_id => user_id }
}
}
end
但在我看来,我想显示小缩略图,因此我们强烈地链接:
<% for image in @images %>
<tr>
<td><%= h( image.name ) %></td>
<td><%= link_to( image_tag( image.thumbnails.small.first.binary.uri, :alt => h( image.name ), :title => h( image.description ) ), :action => :show, :id => image.id ) %></td>
</tr>
<% end %>
h(image.name),:title=>h(image.description)),:action=>:show,:id=>image.id)%%>
查看图像标签
。对于每个图像,它将识别第一个小缩略图,然后链接该缩略图以检索其物理文件位置。这并不完全是我想要的,因为它需要对每个图像进行额外的数据库访问,但在这个特定的实例中,它可能更准确地满足我的需要。对于这一点,它们总是很方便,我在那里花了很多时间
查看has_many:through Association,它允许Images模型连接这些表,并允许与图像相关的其他字段
Thumbnail
has_many :images
has_many :users, :through => :images
Image
belongs_to :user
belongs_to :thumbnail
User
has_many :images
has_many :thumbnails, :through => :images
然后,当访问与用户相关的缩略图时,您可以这样做
@user.thumbnails
或者一个缩略图应该有一个图像和一个用户
Thumbnail
belongs_to :image
Image
belongs_to :user
has_one :thumbnail
User
has_many :images
has_many :thumbnails, :through => :images
对于特定用户,您可以通过执行以下操作找到所有缩略图
@user = User.find(:id, :include => :thumbnails)
:缩略图必须在用户模型中定义为revgum在其答案中显示的关联。要漂亮地编写复杂的查询,还可以使用squirrel之类的工具。Squirrel是一个插件,允许您以更自然的方式编写复杂的查询:
User.find(:all) do
first_name == "Jon" # first_name = 'Jon'
email =~ "%@thoughtbot.com" # email LIKE '%@thoughtbot.com'
created_at >= 4.years.ago # created_at >= '2004-06-27 10:34:22'
awesomeness <=> (1..10) # awesomeness BETWEEN 1 AND 10
banned_since == nil # banned_since IS NULL
end
更多信息请访问。另外,一定要在Github上查看他们的wiki页面。hmm,好的。我读了关于:通过,但我想我读了太多关于我所看到的东西,因为我把这个选项等同于has_和属于许多人。我将为其他协会重读。我仍然不太明白如何只得到我需要的东西。本质上,我在寻找一个WHERE子句,它看起来像“WHERE thumbnails.name='small'和Thumbnail.Image.user\u id=current\u user”(当然是伪代码)。简单的SQL,但我认为在Rails中,如果没有多个查询或返回比我需要/想要的多得多的内容,就无法做到这一点。我遗漏了什么吗?如下面列出的Maulin,您可以添加:条件以缩小结果范围:@user=user.find(:id,:include=>:thumbnails,:conditions=>['thumbnails.name=?,'small']哦,需要澄清的是,当使用:include with the User.find时,您将自动获得加入,因为模型具有指定的关联。因此,用户\u id=current\u User是理所当然的,而:conditions是添加thumbnails.name='small'子句的内容。当您遍历@User.thumbnails数组时,它将是一个元素我刚才在Twitter上评论说,没有什么比学习一个新的框架更能让你觉得自己是个十足的白痴了。这就是我现在所处的位置。我真正想做的是找到缩略图(Thumbnail.find())谁的名字是'Small',谁的图像的用户id是1。你介意让我沉迷于代码吗?我想我需要一个例子,b/c我一点也不懂。在我的上下文中,使用user.find()是没有意义的。所以,当然,我尝试的下一件事实际上起了作用:缩略图。find(:all,:include=>:image,:conditions=>[“images.user_id=?和thumbnails.name=?”,1,'Small'])。若要使用关联,是否必须使用字符串条件?是否需要:include=>{:images=>:thumbnails}?命名的作用域肯定是一种方法,在模型中保留尽可能多的逻辑!
@user = User.find(:id, :include => :thumbnails)
User.find(:all) do
first_name == "Jon" # first_name = 'Jon'
email =~ "%@thoughtbot.com" # email LIKE '%@thoughtbot.com'
created_at >= 4.years.ago # created_at >= '2004-06-27 10:34:22'
awesomeness <=> (1..10) # awesomeness BETWEEN 1 AND 10
banned_since == nil # banned_since IS NULL
end
Post.find(:all) do
user.first_name.contains? "Jon"
end