RanSack复杂的对象关系没有构建...(找不到方法错误)

时间:2011-10-18 16:13:40

标签: ruby-on-rails-3.1 associations ransack

首先是警告。我是一个总的RoR n00b,但我有编程的经验,所以我得到基本的。我有一个应用程序,我正在构建,我需要构建一个复杂的搜索引擎。基本布局是指南>>个人资料>> Mentorings>> 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

在我的指导控制器中,我有:

@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代码进行了更新

2 个答案:

答案 0 :(得分:4)

如果我正确阅读您的代码,您需要:

:profile_mentor_areas_mentor_area_cont

答案 1 :(得分:0)

我认为是:

:profiles_mentorings_mentor_area_mentor_area_contains

基本上,您必须考虑按顺序逐个访问哪些表格才能到达您的搜索字段。我认为,在您的情况下,您的指南视图需要通过:个人资料 - &gt;指导 - &gt; mentor_area为了寻找导师区?您的mentor_area只有配置文件:通过指导模型。如果不先通过指导模型,就不能直接进入mentor_are。

另外,

<%= f.label :guides_profiles_mentor_areas_mentor_area_contains %>

在视图中看起来非常麻烦。你可以这样说:

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

希望有效。