Detect returns the first item in the list for which the block returns TRUE. Your first example:
[1,2,3,4,5,6,7].detect { |x| x.between?(3,4) }
=> 3
Returns 3 because that is the first item in the list that returns TRUE for the expression x.between?(3,4).
detect stops iterating after the condition returns true for the first time. select will iterate until the end of the input list is reached and returns all of the items where the block returned true.