Method chaining là kỹ thuật gọi nhiều method liên tiếp trên cùng một object bằng cách mỗi method trả về self.
ruby
class QueryBuilder
def initialize
@conditions = []
@order = nil
@limit = nil
end
def where(condition)
@conditions << condition
self # trả về self để chain tiếp
end
def order(column)
@order = column
self
end
def limit(n)
@limit = n
self
end
def to_sql
sql = "SELECT * FROM users"
sql += " WHERE #{@conditions.join(' AND ')}" unless @conditions.empty?
sql += " ORDER BY #{@order}" if @order
sql += " LIMIT #{@limit}" if @limit
sql
end
end
QueryBuilder.new
.where("age > 18")
.where("active = true")
.order("name")
.limit(10)
.to_sql
# => "SELECT * FROM users WHERE age > 18 AND active = true ORDER BY name LIMIT 10"ActiveRecord, Arel và hầu hết Ruby DSL đều dùng pattern này.
Method chaining is a technique where multiple methods are called in sequence on the same object by having each method return self.
ruby
class QueryBuilder
def initialize
@conditions = []
@order = nil
@limit = nil
end
def where(condition)
@conditions << condition
self
end
def order(column)
@order = column
self
end
def limit(n)
@limit = n
self
end
def to_sql
sql = "SELECT * FROM users"
sql += " WHERE #{@conditions.join(' AND ')}" unless @conditions.empty?
sql += " ORDER BY #{@order}" if @order
sql += " LIMIT #{@limit}" if @limit
sql
end
end
QueryBuilder.new
.where("age > 18")
.order("name")
.limit(10)
.to_sqlActiveRecord, Arel, and most Ruby DSLs use this pattern.