2015-04-21 3 views
1

У меня есть модель работы и модель местоположения в приложении моих рельсов. Я использую postgresql как database.so у меня есть location_ids как поле массива в моей модели работы для размещения мест. Я использую FeriendlyId в своем приложении, чтобы сделать мой URL-адрес дружественным. когда я иду в шоу-странице работы я получаю этот дружественного URLslug кандидаты рельсы 4

http://localhost:3000/jobs/seo-trainee 

но теперь я также хочу, чтобы включать в себя места работы имеет в своих URL, что-то вроде этого

http://localhost:3000/jobs/seo-trainee-mumbai-tokyo 

я знаю, что мы для этой цели можно использовать slug_candidates. но я не знаю, как я могу добиться этого именно

В настоящее время у меня есть это в моей модели работы

extend FriendlyId 
friendly_id :slug_candidates, use: [:slugged, :finders] 

def slug_candidates 
    [ 
    :title, 
    [:title, :id] 
    ] 
end 

ответ

3

Вам нужно определить собственный метод для создания вашего определения слизняка, а затем сказать FriendlyId использовать этот метод ,

Документация дает этот пример:

class Person < ActiveRecord::Base 
    friendly_id :name_and_location 
    def name_and_location 
    "#{name} from #{location}" 
    end 
end 

bob = Person.create! :name => "Bob Smith", :location => "New York City" 
bob.friendly_id #=> "bob-smith-from-new-york-city" 

Так что в вашем случае, вы будете использовать что-то вроде этого:

class SomeClass 
    friendly_id :job_name_and_location 

    def job_name_and_location 
    "#{name} #{locations.map(&:name).join(' ')}" 
    end 
end 

Я сделал несколько предположений:

  • Ваша модель работы имеет атрибут name (seo training)
  • Ваша модель работы has_many локации, каждый из которых имеет name атрибут

Затем мы создаем метод, который определяет недружественную строку, которая FriendlyId будет использовать для создания слизняка с. В этом случае это придумает что-то вроде SEO Training Mumbai Tokyo и использует его для создания пули seo-training-mumbai-tokyo.

0

Вы можете использовать что-то вроде следующего:

extend FriendlyId 
friendly_id :slug_candidates, use: [:slugged, :finders] 

def slug_candidates 
    locs = Location.where("id IN(?)", self.location_ids).collect{|l| l.name}.join("-") // here, we find the locations for the current job, then joins the each locations name with a '-' sign 
    return self.title+"-"+locs // here, returns the job title with the location names 
end 

Таким образом, если текущее задание выполняется location_ids = [1,2,3] затем из таблицы Location мы находим места с идентификатором = 1,2 , 3. Затем присоединитесь к их именам.

+0

Вы не должны действительно определять SQL, как это в Rails, если вы не делаете что-то необычайно вне сферы действия ActiveRecord. Что случилось с использованием стандартной ассоциации? – Jon

+0

thanx много:) – kali

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