rails 3,如何在两个表中轻松查询?

时间:2011-02-19 09:17:01

标签: ruby-on-rails activerecord

我认为这是一个微不足道的问题,但它让我不知道......

person has_many items
item has_many keywords

项目包含字段ID,person_id,名称

关键字包含字段ID,item_id,txt

在我的Person控制器中:

def find_all_items_matching_keyword(aword)
   ????
end

是否有一个查询返回所有项目(item.person_id = self.id)和关联的(keyword.txt = aword)

3 个答案:

答案 0 :(得分:2)

您的代码应该类似于

def find_all_items_matching_keyword(aword)
   return Item.joins(:keyword).where("keywords.txt=':keyword'",{:keyword => aword })
end

它应该进入助手(这是正确的位置)。

答案 1 :(得分:2)

这个查询非常简单,您应该使用这样的单个范围构建它:

class Item
  scope :by_keyword, lambda{ |keyword| joins(:keywords).where('keywords.txt = ?', keyword) }
end

然后,您可以在控制器中查询特定人员的所有项目,如下所示:

class PersonsController
  def action
    @person = Person.find(params[:id])
    @items_by_keyword = @person.items.by_keyword(params[:aword])
  end
end

然后,您可以在视图中循环显示该列表,例如:

<% @items.by_keyword.each do |item| %>
  <%= item.name %>
<% end %>

答案 2 :(得分:1)

您可以使用find_by_sql http://guides.rubyonrails.org/active_record_querying.html#finding-by-sql

如果你想与数据库无关,你应该能够

items.keywords.each do |keyword| {
   #do stuff
} 

activerecord应该为您延迟加载相关模型。