Связи сложных объектов RanSack не строятся ... (ошибка метода не найдена) - PullRequest
0 голосов
/ 18 октября 2011

Первые замечания. Я полный RoR n00b, но у меня есть опыт программирования, поэтому я получаю базовые. У меня есть приложение, которое я создаю, для которого мне нужно создать сложную поисковую систему. Базовая схема: Руководства >> Профили >> Менторство >> MentorAreas. Ниже приведен код для каждой из моделей, а затем код, который я пытаюсь построить. Моя проблема в том, что я не могу найти правильное имя объекта, чтобы заставить поисковую систему искать mentor_areas.

Настройка системы:

rails -v :: Rails 3.1.1
ruby -v :: ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]
RanSack :: ransack (0.5.8) from git://github.com/ernie/ransack.git (at master) 

Руководство:

class Guide < User
end

Пользователь: (что актуально)

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Virtual attribute for authenticating by either username or email
  # This is in addition to a real persisted field like 'username'
  attr_accessor :login

  # Setup accessible (or protected) attributes for your model
  attr_accessible :login, :username, :email, :password, :password_confirmation, :remember_me, :sex, 
    :location, :role, :first_name, :last_name, :home_town, :profile_attributes

  has_one :profile, :dependent => :destroy
  accepts_nested_attributes_for :profile, :allow_destroy => true

  has_and_belongs_to_many :roles

end

Профиль

class Profile < ActiveRecord::Base
  belongs_to :user
  has_many :mentor_areas, :through => :mentorings
  has_many :mentorings

  accepts_nested_attributes_for :mentor_areas, 
     :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }, :allow_destroy => true

  validates_uniqueness_of  :user_id
end

Наставничество

class Mentoring < ActiveRecord::Base
   belongs_to :mentor_area
   belongs_to :profile

   validates_uniqueness_of  :profile_id, :scope => :mentor_area_id
end

MentorArea

class MentorArea < ActiveRecord::Base
  has_many :profiles, :through => :mentorings
  has_many :mentorings

  validates_uniqueness_of  :mentor_area
end

В моем контроллере Guides у меня есть:

@search_guides = Guide.joins(:roles).where("sex = :sex AND roles.name = :role",{:sex => current_user.sex, :role => 'guide'}).search(params[:search])
@guides_found = @search_guides.all 

и на мой взгляд (index.html.erb) у меня есть следующее:

<%= form_for @search_guides do |f| %>
    <%= f.label :username_cont %>
    <%= f.text_field :username_cont %><br />
    <%= f.label :guides_profiles_mentor_areas_mentor_area_cont %>
    <%= f.text_field :guides_profiles_mentor_areas_mentor_area_cont %><br />
    <%= f.submit %>
<% end %>

Кажется, я не могу понять, какое должно быть правильное имя для второго поля, чтобы оно выполняло поиск по адресам mentor_areas, которые были связаны с данным профилем.

спасибо заранее!

Обновлено для RanSack Code

Ответы [ 2 ]

4 голосов
/ 27 октября 2011

Если я правильно читаю ваш код, вы хотите:

:profile_mentor_areas_mentor_area_cont
0 голосов
/ 20 октября 2011

Я думаю, что это:

:profiles_mentorings_mentor_area_mentor_area_contains

По сути, вам нужно подумать о том, к каким таблицам вам нужно последовательно переходить по очереди, чтобы попасть в поле поиска.Я думаю, что в вашем случае ваше представление о гидах должно пройти через: анкеты -> наставничество -> mentor_area, чтобы найти область наставника?У вашего mentor_area есть только профили: через модель наставничества.Вы не можете перейти непосредственно к mentor_are, не пройдя сначала модель наставничества.

Кроме того,

<%= f.label :guides_profiles_mentor_areas_mentor_area_contains %>

выглядит действительно громоздким в представлении.Вы можете просто сказать это вместо этого:

<%= f.label "Mentor Area" %>

Надеюсь, что это работает.

...