Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.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 ROR:从多个表中选择_Ruby On Rails_Activerecord_Has And Belongs To Many - Fatal编程技术网

Ruby on rails ROR:从多个表中选择

Ruby on rails ROR:从多个表中选择,ruby-on-rails,activerecord,has-and-belongs-to-many,Ruby On Rails,Activerecord,Has And Belongs To Many,我有两个表格:兴趣和链接界面这是用来记录用户和兴趣的 我想输入用户id并显示用户拥有的所有兴趣名称 在Link_ui控制器中: def output @interests = LinkUi.find_by_sql [ 'SELECT interests.name FROM link_uis, interests WHERE link_uis.interest_id = interests.id AND link_uis.user_id=? ', params['user_id'

我有两个表格:兴趣和链接界面这是用来记录用户和兴趣的 我想输入用户id并显示用户拥有的所有兴趣名称

在Link_ui控制器中:

 def output
    @interests = LinkUi.find_by_sql [ 'SELECT interests.name FROM link_uis, interests
    WHERE link_uis.interest_id = interests.id AND link_uis.user_id=? ', params['user_id'] ]
和输入页面:

<%= form_tag :action => 'output', :method => 'post' %>
  enter id.
  <%= text_field_tag ':user_id', '', 'size' => 30 %>
结果一无所获,但我确信数据库中有匹配的数据。如果我不输入参数,只需设置link_uis.user_id=1,结果是:

your search are [#<LinkUi >, #<LinkUi >, #<LinkUi >, #<LinkUi >]
这有什么问题?

嗯,LinkUi模型上的find_by_sql要求您从LinkUi表返回列,而您只选择了interests.name。然而,您正在选择与ActiveRecord进行一点斗争,如下所示:

您通常希望避免通过sql查找,而是让ActiveRecord为您生成sql。对于您的示例来说,最重要的可能是关联

在我看来,你有很多用户,也有很多兴趣。您的LinkUi将这两者联系在一起,LinkUi属于用户和兴趣。请随意纠正我的这一点;这是我从您的示例中收集到的您的业务逻辑

我强调的这些类的名称是在app/models目录中定义的模型。它们之间的关联关系应该在这些类上定义

从用户模型中的简单关联开始:

你可以更进一步;对于任何用户,您都可以直接获取他/她的兴趣。一旦建立了上述关联,就可以将两个“步骤”合并为一个,如下所示:

class User < ActiveRecord::Base
  has_many :link_uis
  has_many :interests, :through => :link_uis
end
嗯,在LinkUi模型上按sql查找需要从LinkUi表返回列,而只选择interests.name。然而,您正在选择与ActiveRecord进行一点斗争,如下所示:

您通常希望避免通过sql查找,而是让ActiveRecord为您生成sql。对于您的示例来说,最重要的可能是关联

在我看来,你有很多用户,也有很多兴趣。您的LinkUi将这两者联系在一起,LinkUi属于用户和兴趣。请随意纠正我的这一点;这是我从您的示例中收集到的您的业务逻辑

我强调的这些类的名称是在app/models目录中定义的模型。它们之间的关联关系应该在这些类上定义

从用户模型中的简单关联开始:

你可以更进一步;对于任何用户,您都可以直接获取他/她的兴趣。一旦建立了上述关联,就可以将两个“步骤”合并为一个,如下所示:

class User < ActiveRecord::Base
  has_many :link_uis
  has_many :interests, :through => :link_uis
end

您好,结果是ActiveRecord::RecordNotFound in Link uisControlleroutput找不到没有ID的用户。但是如果我使用interest_names=User.find1.interests.collect{| I | I.name},它可以工作。那么,我的输入有没有做错什么?我确信参数已发送。谢谢。Rails日志文件应该显示服务器看到的表单参数。我刚才注意到您使用“:user\u id”调用text\u field\u标记,但它应该是简单的“user\u id”或:user\u id。前者是Ruby字符串类型,后者是Ruby符号类型。谢谢。它与:user\u id一起工作。非常感谢您的友好帮助。您好,结果是ActiveRecord::RecordNotFound in Link UIControllerOutput找不到没有ID的用户。但是如果我使用interest_names=User.find1.interests.collect{| I | I.name},它会工作。那么,我的输入有没有做错什么?我确信参数已发送。谢谢。Rails日志文件应该显示服务器看到的表单参数。我刚才注意到您使用“:user\u id”调用text\u field\u标记,但它应该是简单的“user\u id”或:user\u id。前者是Ruby字符串类型,后者是Ruby符号类型。谢谢。它与:user\u id一起工作。非常感谢你的帮助。
class LinkUi < ActiveRecord::Base
  belongs_to :user
  belongs_to :interest
end
user = User.find params['user_id']
link_uis = user.link_uis.all(:include => :interest)
interest_names = link_uis.collect { |link_ui| link_ui.interest.name }
class User < ActiveRecord::Base
  has_many :link_uis
  has_many :interests, :through => :link_uis
end
interest_names = User.find(params[:user_id]).interests.collect { |i| i.name }