Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails中的复杂查询 Rails和ActuvReCordd在处理我认为非常简单的处理单个模型的问题上做得非常好。我现在的情况是,我需要做一些稍微复杂一点的事情——但仍然很琐碎——而我不知道如何去做_Ruby On Rails - Fatal编程技术网

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