рельсы 3, как сделать этот простой запрос по двум таблицам? - PullRequest
0 голосов
/ 19 февраля 2011

Я думаю, что это тривиальный запрос, но он ускользает от меня ...

person has_many items
item has_many keywords

У элемента есть поля id, person_id, name

Ключевое слово имеет поля id, item_id, txt

В моем контроллере Person:

def find_all_items_matching_keyword(aword)
   ????
end

есть ли один запрос, который возвращает все элементы, где (item.person_id = self.id) и связанный с ним (keyword.txt = aword)

Ответы [ 3 ]

2 голосов
/ 19 февраля 2011

Ваш код должен выглядеть примерно так:

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

, и он должен идти в помощниках (это его правильное место).

2 голосов
/ 19 февраля 2011

Этот запрос достаточно прост, чтобы вы могли создать его с одной областью, например:

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 %>
1 голос
/ 19 февраля 2011

вы можете использовать find_by_sql http://guides.rubyonrails.org/active_record_querying.html#finding-by-sql

если вы хотите быть независимым от базы данных, вы должны уметь

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

activerecord должен лениво загружать связанные с вами модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...