I use Ernie Miller's excellent meta_search gem for searching the contents of tables in my Rails 3 Apps.
I have a lot of index views that are tables of data and each has a search form at the top of the page that uses meta search and the column headers use the sort links provided by meta_search to reorder the rows.
Typically I also have custom columns, such as the number of objects that are associated with a given row via some relationship. Some of those relationships can be quite complex and in some cases there is no simple way to express them in a way that works with meta_search.
I handle the sorting in the controller. It's outside the database but with my current application the amount of data makes this perfectly manageable.
I've come up with a way to let my custom column sorting coexist with meta_search and I reckon it might be useful to others.
All the code can be found at this gist on Github :https://gist.github.com/1019358
It works by adding another parameter called 'custom_sort' to the existing search[] parameters. The index action in the controller sees this, performs the custom sort and passes a custom_sort value to the view.
The view calls the custom_sort_helper with a set of arguments and that creates the column header link with the correct parameters to pass back to the controller.
So far it works well and allows me to sort on my custom columns with a set of rows selected by meta_search searches.
I'm sure the code could be more elegant - leave me a column and tell my how.
A collection of computer systems and programming tips that you may find useful.
Brought to you by Craic Computing LLC, a bioinformatics consulting company.
Friday, June 10, 2011
Tuesday, June 7, 2011
Rails send_data and UTF-8
I often use send_data to output plain text from a Rails action, typically as a simple way to download, say, a CSV format file.
I'll have something like this to output the text to the browser:
send_data(@output, :type => 'text/plain', :disposition => 'inline')
I'll have something like this to output the text to the browser:
send_data(@output, :type => 'text/plain', :disposition => 'inline')
But if the text is UTF-8 and contains non-ASCII characters then you need to specify the character set.
Confusingly, to me, you don't do this with a separate argument at the Rails level. Instead you add it as a modifier on the :type argument like this:
send_data(@output, :type => 'text/plain; charset=utf-8', :disposition => 'inline')
Friday, June 3, 2011
Rails migration add_column and Postgresql
Just ran into a difference between MySQL and Postgresql when running a migration that added a new column to an existing table.
The intent of the original line was to add a new boolean column called 'active' and set the default value to true:
add_column :people, :active, :boolean, :default => true
This works fine on MySQL but with Postgresql the default value was not used on existing records. It appears that Postgresql sees that NULL is an acceptable value for the column and uses that as the value.
The way to fix this is to add a 'null' attribute to the call like this:
add_column :people, :active, :boolean, :default => true, :null => false
The intent of the original line was to add a new boolean column called 'active' and set the default value to true:
add_column :people, :active, :boolean, :default => true
This works fine on MySQL but with Postgresql the default value was not used on existing records. It appears that Postgresql sees that NULL is an acceptable value for the column and uses that as the value.
The way to fix this is to add a 'null' attribute to the call like this:
add_column :people, :active, :boolean, :default => true, :null => false
Now, running rake db:migrate sets all existing records to true
Google Chrome Browser, Integers and HTML5 forms
In HTML5 forms you can specify the type of input that is expected with the 'type' attribute.
For example, type = "number" specifies that the input tag expects a number. In general this is great as it permits client side validation, but it can have some side effects in some cases.
The specific case that is causing me problems occurs in the Google Chrome browser when it handles integers entered into an input element with type = "number".
Rather than simple displaying the integer, Chrome inserts commas into the number.
For example, 123456789 becomes 123,456,789
The commas are not included when the form is submitted but they are there if I cut and paste the text.
I don't want these - if I give it an integer all I want to see if the integer. But there is no readily accessible option in Chrome to disable this feature.
The workaround is to explicitly set the type to text (type = "text"). You lose the client side validation but you avoid the commas.
Now, I write Rails applications and use the simple_form gem to help create forms. This knows about the types of input each form input is going to accept and so it liberally uses the 'type' attrbutes. Fortunately you can override these as follows:
<%= f.input :myinteger, :input_html => { :type => 'text'} %>
The real solution, in my opinion, is for the browser to act very conservatively in interpreting user input. If the server wants the user to see commas then it should tell the browser explicitly.
For example, type = "number" specifies that the input tag expects a number. In general this is great as it permits client side validation, but it can have some side effects in some cases.
The specific case that is causing me problems occurs in the Google Chrome browser when it handles integers entered into an input element with type = "number".
Rather than simple displaying the integer, Chrome inserts commas into the number.
For example, 123456789 becomes 123,456,789
The commas are not included when the form is submitted but they are there if I cut and paste the text.
I don't want these - if I give it an integer all I want to see if the integer. But there is no readily accessible option in Chrome to disable this feature.
The workaround is to explicitly set the type to text (type = "text"). You lose the client side validation but you avoid the commas.
Now, I write Rails applications and use the simple_form gem to help create forms. This knows about the types of input each form input is going to accept and so it liberally uses the 'type' attrbutes. Fortunately you can override these as follows:
<%= f.input :myinteger, :input_html => { :type => 'text'} %>
Distinct Logins to a Rails App using Google Chrome Browser
If you are developing a Rails app that requires user login, then it can be really helpful to have more than one browser window open at a time, with a separate user logged into each.
For example, I typically have an Administrator user with special privileges as well as regular users. I want to test my app from both perspectives at the same time.
But because my app uses cookies to handle session information, I can't simply have two logins from the same browser. Until now I've dealt with this by having one user in Firefox and one in Safari, or Chrome.
Google Chrome allows you open Incognito Windows that store cookies, history, etc. in a sandbox that is destroyed when you close the window. This allows me to manage two active logins from Chrome.
Open up your first account in a normal window, then open an Incognito window and login as the second user... Simple!
Cookies, etc are shared between all Incognito windows and so you only get to have two active users, but even so this is really useful.
Firefox and other browsers have similar modes - Firefox has 'private browsing' - these may well give you similar functionality.
For example, I typically have an Administrator user with special privileges as well as regular users. I want to test my app from both perspectives at the same time.
But because my app uses cookies to handle session information, I can't simply have two logins from the same browser. Until now I've dealt with this by having one user in Firefox and one in Safari, or Chrome.
Google Chrome allows you open Incognito Windows that store cookies, history, etc. in a sandbox that is destroyed when you close the window. This allows me to manage two active logins from Chrome.
Open up your first account in a normal window, then open an Incognito window and login as the second user... Simple!
Cookies, etc are shared between all Incognito windows and so you only get to have two active users, but even so this is really useful.
Firefox and other browsers have similar modes - Firefox has 'private browsing' - these may well give you similar functionality.
Wednesday, June 1, 2011
Craic Therapeutic Antibodies Database
Craic Computing LLC is pleased to announce the launch of the Tabs Therapeutic Antibody Database
Tabs is a unique database focused solely on Therapeutic Abs under development by the Biotechnology industry.
Tabs is a unique database focused solely on Therapeutic Abs under development by the Biotechnology industry.
As of 1st June 2011, Tabs contains data on more than 950+ antibodies, targeting 400+ antigens, being developed by 300+ companies.
Antibody records are linked to a wide range of associated data including:
- Patents
- Papers
- Clinical Trials
- Antigens
- Companies
- Conditions/Indications
- Regulatory Actions
- Protein Sequences
- Protein Structures
- Press Releases
- Development Timelines
- Conference Abstracts
The database is intended for Biotechnology industry staff - especially those in R&D and in Business Development.
Research staff have direct access to relevant patents and papers for each antibody.
BizDev staff can see the big picture of developments against a target antigen across companies.
Users can define custom Antibody Sets and download data in to Excel, bioinformatics software and popular Reference management tools. Whenever new data related to Antibody Sets are added to the database, users can be alerted by email.
Tabs is offered as a web based subscription service to biotech companies. The annual subscription offers unlimited access to unlimited users for a given site.
Tabs can be evaluated with a 30 day Free Trial. Sign up for an account here.
Subscribe to:
Posts (Atom)