2013-08-09 2 views
-1

В моем приложении rails мне нужно вызвать метод, определенный в одной таблице с другого контроллера. Существуют две таблицы с координатами и твитами. Условие таблицы твитов определяется таблицей координат. В моем окончательном представлении мне нужно отобразить атрибуты таблицы твитов, для которых условие определяется таблицей координат. Мои координаты кодовая таблицавызов метода в модели с другого контроллера в rails 3

class Coordinates<ActiveRecord::Base 
     def self.query() 
     a = Coordinates.where("city=?", params[:show]) 
     b = a.first 
     if a.count == 1 
      latitude = b.latitude 
      longitude= b.longitude 
      if(latitude=0 && longitude=0) then 
      return sql="Select * from tweets where tweet_text LIKE '%text%' AND user_loc LIKE '%show%' order by id desc" 
      else if (latitude!=0 && longitude!=0) 
       min_lat = latitude - 1.0 
       max_lat = latitude + 1.0 
       min_lng = longitude - 1.0 
       max_lng = longitude + 1.0 
       return sql = "Select * from tweets where tweet_text LIKE '%text%' AND (((longitude BETWEEN min_lng and max_lng) AND (latitude BETWEEN min_lat and max_lat)) OR (user_loc LIKE '%show%')) order by id desc" 
       else 
       return sql="Select * from tweets where tweet_text LIKE '%text%'" 
       end  
      end 
     end 

Мои твиты стол

class Tweets<ActiveRecord::Base 
    attr_accessible :id, :tweet_created_at, :tweet_id, :tweet_text, :tweet_source, :user_id, :user_name, :user_sc_name, :user_loc, :user_img, :longitude, :latitude, :place, :country 

end 

нужно вызвать определение запроса из моего tweets_controller так, что он решает, что запрос на выборку из таблицы чириканье и отображения в окончательном зрения , Но функция params не работает в файле model.rb. Я хочу что-то вроде этого Моего tweets_controller.rb

class TweetsController<ApplicationController 
    def index 
    Coordinates.query() 
    end 
end 

Моего окончательный кода вида

<%= @tweets.each do |tweets| %> 

<ul> 

    <li><%= tweets.id %></li> 
    <li><%= tweets.tweet_created_at %></li> 

    <li><%= tweets.tweet_source %></li> 
    <li><%= tweets.tweet_text %></li> 
    <li><%= tweets.user_id %></li> 
    <li><%= tweets.user_name %></li> 
    <li><%= tweets.user_sc_name %></li> 
<li><%= tweets.user_loc %></li> 
    <li><%= tweets.user_img %></li> 
    <li><%= tweets.longitude %></li> 
    <li><%= tweets.latitude %></li> 
<li><%= tweets.place %></li> 
    <li><%= tweets.country %></li> 

</ul> 
<% end %> 

Я не может вызвать функцию запроса, определенную в таблице координат из tweetscontroller. Также я пробовал использовать вспомогательные методы, но это, похоже, не помогает и звучит очень сложно. Любой любезно поможет мне с этим

ответ

0

Вы звоните Coordinates.query(), но на самом деле вы не храните возвращаемое значение.

Попробуйте это:

@tweets = Coordinates.query()

+0

Это говорит неопределенный метод '' Params в координатах модели. Как мне продолжить? – user2492854

2

В вашем self.query метод в модели, установите аргумент так:

class Coordinates<ActiveRecord::Base 

     def self.query(something) 
     a = Coordinates.where("city=?", something) 
     b = a.first 
     if a.count == 1 
      latitude = b.latitude 
      longitude= b.longitude 
      if(latitude=0 && longitude=0) then 
      return sql="Select * from tweets where tweet_text LIKE '%text%' AND user_loc LIKE '%show%' order by id desc" 
      else if (latitude!=0 && longitude!=0) 
       min_lat = latitude - 1.0 
       max_lat = latitude + 1.0 
       min_lng = longitude - 1.0 
       max_lng = longitude + 1.0 
       return sql = "Select * from tweets where tweet_text LIKE '%text%' AND (((longitude BETWEEN min_lng and max_lng) AND (latitude BETWEEN min_lat and max_lat)) OR (user_loc LIKE '%show%')) order by id desc" 
       else 
       return sql="Select * from tweets where tweet_text LIKE '%text%'" 
       end  
      end 
     end 

В контроллере, передать ваш params[:show] в качестве параметра:

class TweetsController<ApplicationController 
def index 
    @tweets = Coordinates.query(params[:show]) 
end 
end 

Теперь это должно сработать. Спасибо

3

На самом деле, я вижу несколько проблем с вашим кодом.

Прежде всего: используйте значащие имена. Вы получаете твиты, относящиеся к определенному городу. Во-вторых, в вашем методе query большинство из того, что вы пытаетесь сделать, это получение твитов, которые должны быть в модели твита.

Что делает ваш код неправильно:

  • это просто строит SQL?
  • он ищет твиты, содержащие фиксированный текст %text%, я предполагаю, что должно быть данным термином ищет
  • он ищет для данного пользовательского местоположения %show%, я предполагаю, что должно быть именем города (ваш params[:show]

что я хотел бы предложить:

  • устанавливающее твиты должны быть в Tweet модели
  • использование более мелких методов
  • для простоты я полагаю, ваш поиск перспективе является params[:text]

Так что я бы написать свой код следующим образом:

class TweetsController < ApplicationController 

    def index 
    city = params[:show] 
    search_term = params[:text] 
    city_coordinates = Coordinates.where('city=?', city) 
    @tweets = if city_coordinates.count == 1 && city_coordinates.first.valid_location? 
       Tweet.for_coordinate(city_coordinates.first) 
       else 
       Tweet.for_user_location(city) 
       end 
    @tweets = @tweets.where("tweet_text like ?", "%#{search_term}%") 
    end 
end 

Не строить SQL себя, пусть ActiveRecord сделать это для вас. Также: where ленив, поэтому вы можете легко их сцепить.

Затем в Coordinate модели добавить

class Coordinate < ActiveRecord::Base 

    def valid_location? 
    self.latitude != 0 && self.longitude != 0 
    end 

end 

и в вашей Tweet модели

class Tweet < ActiveRecord::Base 

    def self.for_coordinate(coordinate) 
    bbox = { min_lat: coordinate.latitude - 1.0, max_lat: coordinate.latitude + 1.0, 
      min_lng: coordinate.latitude - 1.0, max_lng: coordinate.latitude + 1.0 
      } 
    Tweet.where("(longitude BETWEEN ? and ?) AND (latitude BETWEEN ? and ?)) OR (user_loc LIKE ?)", 
     bbox[:min_lng], bbox[:max_lng], bbox[:min_lat], bbox[:max_lat], "%#{coordinate.city}%") 

    end 

    def self.for_user_location(city) 
    Tweet.where("user_loc like ?", "%#{city}%") 
    end 

end   
+0

thks a ton. Это очень помогло мне и купило меня очень близко. Его маршрутизация на правильный контроллер, так как он показывает широту этого места, но он говорит «неопределенный метод» - в приложении/models/tweets.rb. В этой строке «bbox = {min_lat: codes.latitude - 1.0, max_lat: координат .latitude + 1.0, ". Вы можете мне помочь? минус-символ – user2492854

+0

Вы используете ruby ​​1.9.3? – nathanvda

+0

ya Я использую ruby ​​1.9.3 – user2492854

Смежные вопросы