2007年12月17日 星期一

外鍵, :joins, :conditions(2) :include

@tasks = Task.find(:all,
                              :include => :goal 
                              :conditions => "goals.name = 'abc' ")

Rails 提供了:include 這樣的選擇, 使用:include選項時在其他參數(如conditions)用到欄位名稱(如name)時,就要加上table name(goals)這樣它才知道正確的查詢

2007年12月12日 星期三

外鍵, :joins, :conditions

JOIN的一些說明
SQL JOIN
left join/right join/inner join的用法比較

example:

goals table

id name
1 abc
2 def

tasks table

id name goals_id
1 task1 1
2 task2 1
3 task3 2

 

想用goal name 做查詢時


@tasks = Task.find(:all,
                              :joins => "inner join goals on tasks.goal_id = goals.id",
                              :conditions => "goals.name = 'abc' ",
                              :select=>"tasks.id, tasks.name, task.goals_id")

如果沒有用:select 會find出

id name goals_id id name
1 task1 1 1 abc
2 task2 1 1 abc

這樣如果直接查@tasks.id 都是查到後面的 goal的id 都是1

所以要用:select 去取出tasks table的部份

這樣便可以查出

id name goals_id
1 task1 1
2 task2 1


2007年12月5日 星期三

取得 select_date 所設定的值, 範圍 prefix

View
<% form_for :task ,:url => {:action => 'query_date_tasks' } do |form|%>
 
 <%= select_date Date.today, :prefix => "stay_from", :include_blank => true %>


<%= select_date Date.today, :prefix => "stay_to", :include_blank => true %>
<%= submit_tag "submit" %>
<% end %>

:prefix 用來設定參數的名稱
:params => { :stay_from => { :year => 2007, :month => 12, :day => 5}}


Controller

def query_date_tasks
 date_stay_from = Date.new(params[:stay_from][:year].to_i,
               params[:stay_from][:month].to_i,
               params[:stay_from][:day].to_i)

 date_stay_to = Date.new(params[:stay_to][:year].to_i,
             params[:stay_to][:month].to_i,
             params[:stay_to][:day].to_i)

 @tasks = Task.find(:all, :conditions => ["finish_time BETWEEN ? AND ?", date_stay_from, date_stay_to])

 render :action => 'list_all_tasks'
end

sortable column headers 使用

Controller
def list_all_tasks
 add_to_sortable_columns('listing', Task, 'task_name')
 add_to_sortable_columns('listing', Task, 'finish_time')
 add_to_sortable_columns('listing', Goal, 'name')

 @tasks = Task.find(:all, :include => :goal, :order => sortable_order('listing', Task, 'task_name'))
end

View
<%= link_to '任務名稱', sort_param('listing', Task, 'task_name') %>
<%= link_to '任務完成時間', sort_param('listing', Task, 'finish_time') %>
<%= link_to '任務所屬目標', sort_param('listing', Goal, 'name') %>

add_to_sortable_columns 是加在需要的controller's action

sortable column headers 使用

Model

def list_all_tasks
add_to_sortable_columns('listing', Task, 'task_name')
add_to_sortable_columns('listing', Task, 'finish_time')
add_to_sortable_columns('listing', Goal, 'name')
@tasks = Task.find(:all, :include => :goal, :order => sortable_order('listing', Task, 'task_name'))
end

View

<%= link_to '任務名稱', sort_param('listing', Task, 'task_name') %>
<%= link_to '任務完成時間', sort_param('listing', Task, 'finish_time') %>
<%= link_to '任務所屬目標', sort_param('listing', Goal, 'name') %>



add_to_sortable_columns 柿子  

2007年12月4日 星期二

sortable column headers 安裝

安裝sortable column headers

基本上, 這樣應該是可以裝的
ruby script/plugin install https://svn.elctech.com/svn/public/sortable_column_headers/

不過作者說了
whoever is maintaining our SVN repository is trying to do something
clever with HTTPS and it isn't working 100% yet :) Try grabbing it
directly from our repository into your Rails app with Subversion like
this (you should execute this command from within your Rails app's root
directory): svn export https://svn.elctech.com/svn/public/sortable_column_headers ./vendor/plugins/sortable_column_headers

所以我們得先安裝SVN才行, 這時可以參可這篇如何在Windows Console下使用命令svn

手動或者綠色安裝svn命令軟件Subversion:

下載軟件版本1.4.3:http://subversion.tigris.org/downloads/svn-win32-1.4.3.zip

安裝方法:7z x svn-win32-1.4.3.zip
mv svn-win32-1.4.3 c:\programme\.
SET SVN_HOME=c:\programme\svn-win32-1.4.3
SET PATH=%PATH%;%SVN_HOME%\bin

這時便可以到你的app(rails_apps\YourApp)下執行

svn export https://svn.elctech.com/svn/public/sortable_column_headers ./vendor/plugins/sortable_column_headers




順邊參考如何安裝Plugin/Engines

2007年12月1日 星期六

如何提交多個check box

list.rhtml

口 AAA_checkbox
口 BBB_checkbox
[submit]

我想要在按下submit之後, 可以更新check box裡面object的某些值後回到list

-------------------
Model

class Goal < style="font-weight: bold;">View, list.rhtml


<% if task.do_or_not? %>
 <%= check_box_tag "task["+task.id.to_s+"][checked]","1",:checked =>"checked"%>
<% else %>
 <%= check_box_tag "task["+task.id.to_s+"][checked]","1"%>
<% end %>
<%= hidden_field_tag("task["+task.id.to_s+"][checked]","0") %>

<%= h(task.task_name) %>

-----------------------
從上面的view 我們可以得到這樣的params

params: {
 :controller=>"user",
 :task=> {
  "2"=>{"checked"=>"0"},
  ... etc...
  "4"=>{"checked"=>"1"}
 },
 :action=>"set_auto_check"
}

---------------------
Controller
, user_controler.rb

def set_auto_check
 @params[:task].each { |task_id, attr|
 task = Task.find(task_id)
 task.update_attribute(:checked, attr[:checked])
}

redirect_to :action => 'list'
end

-------------------------
而controller裡會把 "2"放到 task_id, "checked" =>"0" 放到 attr.

這樣便可以完成提交多個check box