A workmate came with a brilliant solution:
def course_search_column(record, input_name)
select :record, :course, options_for_select(Course.all.collect {
|c| [c.name, c.name] }), {:include_blank => as_('-select-')},
input_name
end
Everything worked as expected. Thanks for everything.
2011/10/10 Cláudio Forain <[email protected]>:
> Thanks for the quick reply. People like you that makes the Open Source
> Community so awesome. Anyway its incredible how reading your own
> problem sometimes gets you to answer your own question.
>
> I just corrected the following line from:
> conf.columns[:document].includes = {:document => :course}
>
> To:
> conf.columns[:course].includes = {:document => :course}
>
> And everything went smoothly
> Anyway, now my problem is tha I would like that search field to be a
> :search (with a dropdown) and not a :text (which it is now). So I
> edited app/helpers/materials_helper.rb to populate the dropdown:
>
> def course_search_column(record, input_name)
> select :record, :course, options_for_select(Material.course),
> {:include_blank => as_('-select-')}, input_name
> end
>
> Using that, trying to search gives me the following error:
>
> ActionView::Template::Error (undefined method `course' for
> #<Class:0x00000003f41520>):
> 4: <label for="<%= "search_#{column.name}" %>"><%=
> column.label %></label>
> 5: </dt>
> 6: <dd>
> 7: <%= active_scaffold_search_for(column) %>
> 8: </dd>
> 9: </dl>
> 10: </li>
> app/helpers/materials_helper.rb:4:in `course_search_column'
>
>
> It shoud work since now Material has the course field delegated for
> document, and if I run the application console (using rails console),
> I get:
>
> irb(main):001:0> material = Material.find(123)
> => #<Material id: 123, discipline_id: 5, document_id: 75, user_id: 35,
> created_at: "2011-09-27 12:29:11", updated_at: "2011-09-28 15:02:11">
>
> irb(main):002:0> material.course
> => #<Course id: 27, name: "1 Medio Regular - Manhã", code: "1 MEDREG-M">
>
> Which means that material.course is a viable "method" . But maybe the
> helper is in a "lower" scope than the model, which means that tthe :
> delegate method won't work while in the helper. Any help will be
> greatly appreciated.
>
> PS: I will try the :has_one :through approach in a while.
>
>
>
>
> 2011/10/10 Cláudio Forain <[email protected]>:
>> Sorry for the above e-mail, reply to all by accident :p
>>
>> 2011/10/10 Cláudio Forain <[email protected]>:
>>> Resolvi o problema da busca. Testa lá em materials na porta 3007. Só a
>>> preciss de 2 coisas agora: ajeitar o data picker e tirar aquelas opcoes da
>>> busca. Abs
>>>
>>> On Oct 9, 2011 9:02 PM, "Claudio Forain" <[email protected]> wrote:
>>>>
>>>> Hi. Im using Rails 3.0.9 and Activescaffold with JQuery.
>>>> As I read about this here:
>>>>
>>>> http://groups.google.com/group/activescaffold/browse_thread/thread/d96173c2eee1a6?tvc=2&q=+search+second
>>>>
>>>> And Here:
>>>> https://github.com/activescaffold/active_scaffold/wiki/Search-on-second-order-association
>>>>
>>>> As I tried to do a second order field search, I will tell you my
>>>> problem:
>>>>
>>>> I have 3 models: Document, Course and Material:
>>>>
>>>> class Document < ActiveRecord::Base
>>>> belongs_to :course
>>>> [...]
>>>>
>>>> class Material < ActiveRecord::Base
>>>> belongs_to :document
>>>> delegate :course, :to => :document, :allow_nil => true
>>>> [...]
>>>>
>>>> class Course < ActiveRecord::Base
>>>> has_many :documents
>>>> [...]
>>>>
>>>>
>>>> As you can see , Material belongs_to Document belongs_to Course
>>>> All I wanted to do is to search a material for something like:
>>>> material.document.course.name (in a active record way)
>>>>
>>>> I read about second order search on the links at the beginning of this
>>>> e-mail, and did the following:
>>>>
>>>> Put the following line in app/models/material.rb
>>>> delegate :course, :to => :document, :allow_nil => true
>>>>
>>>> And the following in app/controllers/materials_controller.rb
>>>> [...]
>>>> conf.field_search.columns = [:discipline, :document_due_date, :course]
>>>> conf.columns << :course
>>>> conf.list.columns.add :course
>>>> conf.columns[:course].search_sql = 'courses.name'
>>>> conf.columns[:document].includes = {:document => :course}
>>>> conf.columns[:course].search_ui = :string
>>>>
>>>> The primary problem is that when I click in courses search field and
>>>> actually put some value in it, it returns me the following error in
>>>> log:
>>>>
>>>> SQL (0.6ms) SELECT COUNT(DISTINCT `materials`.`id`) FROM
>>>> `materials` LEFT OUTER JOIN `disciplines` ON `disciplines`.`id` =
>>>> `materials`.`discipline_id` LEFT OUTER JOIN `documents` ON
>>>> `documents`.`id` = `materials`.`document_id` LEFT OUTER JOIN `users`
>>>> ON `users`.`id` = `materials`.`user_id` WHERE (((courses.name LIKE '%a
>>>> %')) AND (disciplines.id IN
>>>> (2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,24,25)) AND
>>>> ((`materials`.`document_id` = '76')))
>>>> Mysql2::Error: Unknown column 'courses.name' in 'where clause': SELECT
>>>> COUNT(DISTINCT `materials`.`id`) FROM `materials` LEFT OUTER JOIN
>>>> `disciplines` ON `disciplines`.`id` = `materials`.`discipline_id` LEFT
>>>> OUTER JOIN `documents` ON `documents`.`id` = `materials`.`document_id`
>>>> LEFT OUTER JOIN `users` ON `users`.`id` = `materials`.`user_id` WHERE
>>>> (((courses.name LIKE '%a%')) AND (disciplines.id IN
>>>> (2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,24,25)) AND
>>>> ((`materials`.`document_id` = '76')))
>>>> Completed 500 Internal Server Error in 446ms
>>>>
>>>> ActiveRecord::StatementInvalid (Mysql2::Error: Unknown column
>>>> 'courses.name' in 'where clause': SELECT COUNT(DISTINCT
>>>> `materials`.`id`) FROM `materials` LEFT OUTER JOIN `disciplines` ON
>>>> `disciplines`.`id` = `materials`.`discipline_id` LEFT OUTER JOIN
>>>> `documents` ON `documents`.`id` = `materials`.`document_id` LEFT OUTER
>>>> JOIN `users` ON `users`.`id` = `materials`.`user_id` WHERE
>>>> (((courses.name LIKE '%a%')) AND (disciplines.id IN
>>>> (2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,24,25)) AND
>>>> ((`materials`.`document_id` = '76')))):
>>>>
>>>>
>>>> As you can see, the generated query calls for courses.name in a join
>>>> that doesnt yeld that table. Am I missing something obvious here?
>>>>
>>>> At first, I thought that it could have something to do with
>>>> field_search, but I also tried with the normal search and had the same
>>>> issue.
>>>>
>>>> Also this way, I have a problem in list. Although I have the following
>>>> line in app/model/course.rb
>>>>
>>>> def to_label
>>>> self.name
>>>> end
>>>>
>>>> Instead of having the content of the 'name' field in list, it gives me
>>>> the instance id, something like: #<Course:0x00000003b0b640>
>>>> I know how to correct this with a virtual column in the material model
>>>> (something like self.document.course.name), but Im just saying, for
>>>> the sake of completion.
>>>>
>>>> Any help will be greatly appreciated. Thanks in advance.
>>>>
>>>
>>
>
--
You received this message because you are subscribed to the Google Groups
"ActiveScaffold : Ruby on Rails plugin" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/activescaffold?hl=en.